PHPer 高手之路
  • Introduction
  • First Chapter
  • 基础
    • 数据类型和常量
    • 字符串
      • 字符编码
      • 字符编码相关编程
    • 引用变量
    • 运算符与错误控制符@
    • 流程控制与条件判断
      • foreach遍历中的引用
    • 函数
    • 文件及目录处理
  • PHP 数组
    • 基础
    • PHP数组操作
    • 输入流 php://input
    • PHP数组的内部实现
    • PHP数组和数据结构
    • 示例技巧
  • PHP文件编程
    • 文件系统
    • 基础
    • 实例技巧
    • PHP中XML处理
    • PHP中JSON处理
    • PHP中CSV处理
    • 大文件上传
  • 正则表达式
    • 基础
    • 正则的引擎
    • 表达式的优化
    • PHP中正则的使用
  • PHP 编码技巧
    • PHP编码习惯
    • PHP语法糖
    • PHP代码优化
    • PHP重点新特性
    • PHP编码规范
  • PHP选项和运行原理
    • PHP SAPI
    • PHP运行模式及安装方式
    • 附录:进程和线程的Q解
    • Apache下的MPM模式
    • Apache 与 Nginx
    • PHP的运行机制及原理
    • PHP垃圾回收机制
    • PHP配置选项
  • PHP安全
    • 跨站脚本攻击(XSS )
    • 跨站请求伪造(CRSF)
  • PHP 高级特性
    • 异常处理(Exceptions)
    • 代码复用(Trait)
    • 预定义接口(Predefined Interfaces)
    • 魔术方法(Magic Methods)
    • 回调函数、匿名函数&闭包
    • 命名空间(Namespaces)
    • 自动加载(Autoload)
    • 反射(Reflection)
    • 魔术常量(Magic constants)
    • 综合实例
  • 附录:关键词
  • 附录:资料
  • 代码的版本控制
    • SVN
    • Git
      • 疑难杂症
  • Linux
    • Linux原理与基础
    • 常见命令
    • Shell 编程
    • awk 与 sed
    • 命令笔记
  • HTTP 协议
    • 请求方法与返回状态码
    • Cookie、Session 的原理
  • MySQL
    • MySQL表存储引擎
  • 标准PHP库(SPL)
    • 数据结构
      • SplPriorityQueue - 优先队列
      • SplQueue - 队列
      • SplStack - 栈的功能
    • 接口
      • Countable - count统计接口
  • 附录:ElasticSearch
  • PHP数据结构
  • 附录:Rabbitmq
  • 附录:guzzle
  • JavaScript
    • 附录:资料
  • 疑难杂症
Powered by GitBook
On this page
  • SimpleXML
  • 常见CDATA 包裹数据处理
  • XMLReader
  • XML Parser

Was this helpful?

  1. PHP文件编程

PHP中XML处理

  • DOM :一次性将xml载入内存,内存问题需要注意

  • SimpleXML:小文件可以选择它,不支持命令空间

  • XMLReader : 边读边操作, “拉取”模型,大文件操作

  • XML Parser : SAX模型是一个“推送”模型,大文件操作

SimpleXML

语法

PHP的语法simplexml_load_string()函数具有以下语法。

simplexml_load_string(data,classname,options,ns,is_prefix);

参数

参数

是必须的

描述

数据

需要。

一个格式正确的XML字符串

班级名称

可选的。

新对象的类

选项

可选的。

额外的Libxml参数。通过指定选项和1或0(TRUE或FALSE,例如LIBXML_NOBLANKS(1))来设置

ns

可选的。

命名空间前缀或URI

is_prefix

可选的。

如果ns是前缀,则为TRUE。如果ns是URI,则为FALSE。默认值为FALSE

选项的可能值:

LIBXML_COMPACT - 激活节点分配优化(可加速应用程序)

  • LIBXML_DTDATTR - 设置默认DTD属性

  • LIBXML_DTDLOAD - 加载外部子集

  • LIBXML_DTDVALID - 使用DTD进行验证

  • LIBXML_NOBLANKS - 删除空白节点

  • LIBXML_NOCDATA - 将CDATA合并为文本节点

  • LIBXML_NOEMPTYTAG - 展开空标记(例如对<br> </ br>),仅在DOMDocument-> save()和DOMDocument-> saveXML()函数中可用

  • LIBXML_NOENT - 替代实体

  • LIBXML_NOERROR - 不显示错误报告

  • LIBXML_NONET - 加载文档时禁用网络访问

  • LIBXML_NOWARNING - 不显示警告报告

  • LIBXML_NOXMLDECL - 保存文档时删除XML声明

  • LIBXML_NSCLEAN - 删除多余的命名空间声明

  • LIBXML_PARSEHUGE - 设置XML_PARSE_HUGE标志,放宽解析器的任何硬编码限制。这会影响极限,如文档的最大深度和文本节点大小的限制

  • LIBXML_XINCLUDE - 实现XInclude替换

  • LIBXML_ERR_ERROR - 获取可恢复的错误

  • LIBXML_ERR_FATAL - 获取致命错误

  • LIBXML_ERR_NONE - 获取无错误

  • LIBXML_ERR_WARNING - 获取简单的警告

  • LIBXML_VERSION - 获取libxml版本

  • LIBXML_DOTTED_VERSION - 获取点分的libxml版本

返回值

成功时返回SimpleXMLElement对象。失败时为FALSE。

示例

简单示例

$string = <<<XML
<?xml version='1.0'?>
<document>
  <cmd>login</cmd>
  <login>imdonkey</login>
</document>
XML;

$xml = simplexml_load_string($string);
print_r($xml);

结果:

SimpleXMLElement Object ( [cmd] => login [login] => imdonkey )

文件不大时,可以配合以下方式转为数组使用

$string = <<<XML
<?xml version='1.0'?>
<document>
<cmd>login</cmd>
<login>imdonkey</login>
</document>
XML;

$xml = simplexml_load_string($string);
$arr = toArray($xml);
print_r($arr);
echo $arr['cmd'];

function toArray($object)
{
    $object = json_decode(json_encode($object), true);
    return $object;
}

常见CDATA 包裹数据处理

simplexml_load_string($string, null, LIBXML_NOCDATA);

示例:

$string = <<<XML
<?xml version='1.0'?>
<document>
<cmd><![CDATA[login]]></cmd>
<login><![CDATA[imdonkey]]></login>
</document>
XML;

$xml = simplexml_load_string($string, null, LIBXML_NOCDATA);
var_dump($xml);

资料:

XMLReader

<?xml version="1.0" encoding="utf-8"?>
<collection>
 <cd>
  <title type="hk">港台明星</title>
  <artist>刘德华</artist>
  <year>1995</year>
 </cd>
 <cd>
  <title>大陆演员</title>
  <artist>范冰冰</artist>
  <year>1997</year>
 </cd>
</collection><?xml version="1.0" encoding="utf-8"?>
<collection>
 <cd>
  <title type="hk">港台明星</title>
  <artist>刘德华</artist>
  <year>1995</year>
 </cd>
 <cd>
  <title>大陆演员</title>
  <artist>范冰冰</artist>
  <year>1997</year>
 </cd>
</collection>

示例

<?php
$items=array();
$reader=new XMLReader();
$reader->open('collection.xml', 'utf-8');
while ($reader->read()){
  //get current data
  if($reader->name=="cd" && $reader->nodeType==XMLReader::ELEMENT){
    $item=[];
    while($reader->read() && $reader->name !="cd" ){
        if($reader->nodeType!=XMLReader::ELEMENT)continue;
        $name=$reader->name;
        $value=$reader->readString();
        $item[$name]=$value;
    }
     $items[]=$item;
  }
}
$reader->close();

print_r($items);

XML Parser

<?php

$file = "collection.xml";
$depth = array();

function startElement($parser, $name, $attrs) 
{
    global $depth;
     /*
    for ($i = 0; $i < $depth[$parser]; $i++) {
        echo "  ";
    }*/
    //echo "$name\n";
    print_r($attrs);
    //$depth[$parser]++;
}

function endElement($parser, $name) 
{
    global $depth;
    //$depth[$parser]--;
}

function data($parser, $data) {
    var_dump($data);
}

$xml_parser = xml_parser_create('UTF-8');
xml_parser_set_option ( $xml_parser , XML_OPTION_SKIP_WHITE  , 1 ) ;
xml_parser_set_option ( $xml_parser , XML_OPTION_CASE_FOLDING  , 0 ) ;

xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "data");

$fp = fopen($file, "r");


while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);
Previous实例技巧NextPHP中JSON处理

Last updated 5 years ago

Was this helpful?

微信开发基础之php函数simplexml_load_string