PHP解析XML的方式
方式一:SimpleXML
使用SimpleXML
可以快速处理简单的xml文本,如调用webservice
接口时,返回如下结果:
<result>
<return_status>1</return_status>
<return_message>操作成功</return_message>
</result>
需要根据结果中的return_status
判断是否操作成功,此时使用SimpleXML
最为方便:
$xml = '<result>
<return_status>1</return_status>
<return_message>操作成功</return_message>
</result>';
$xml_obj = simplexml_load_string($xml);
print_r($xml_obj);
输出结果:
SimpleXMLElement Object
(
[return_status] => 1
[return_message] => 操作成功
)
此时可以直接判断$xml_obj->return_status
方式二:XMLReader
对于复杂的XML数据,使用SimpleXML
的解析结果,就不太直观了,此时需要使用XMLReader
或者XML Parser
的进行处理。
比如下面的xml:
<?xml version="1.0" encoding="utf-8"?>
<root>
<pageData start="1" limit="15" total="100">
<record>
<field name="tuIdc" value="000001" />
<field name="tuCname" value="张三" />
<field name="tuSex" value="1" />
</record>
<record>
<field name="tuIdc" value="000002"/>
<field name="tuCname" value="李四"/>
<field name="tuSex" value="1"/>
</record>
<record>
<field name="tuIdc" value="000003"/>
<field name="tuCname" value="王五" />
<field name="tuSex" value="1" />
</record>
</pageData>
</root>
使用XMLReader
:
$reader = new XMLReader();
$reader->XML($xml, 'utf-8');
while ($reader->read()) {
if ($reader->nodeType == XMLReader::ELEMENT) {
// xml开始标签
$tag_name = $reader->name;
if ($tag_name == 'root') {
echo "文档开始" . PHP_EOL;
} elseif ($tag_name == 'pageData') {
echo '分页数据:当前是从第' . $reader->getAttribute('start') . '条开始,取' . $reader->getAttribute('limit') . '条,共有' . $reader->getAttribute('total') . '条记录' . PHP_EOL;
} elseif ($tag_name == 'record') {
echo '----------开始读取记录----------' . PHP_EOL . '初始化 $user ...' . PHP_EOL;
$user = array();
} elseif ($tag_name == 'field') {
$user[$reader->getAttribute('name')] = $reader->getAttribute('value');
}
} else if ($reader->nodeType == XMLReader::END_ELEMENT) {
// xml结束标签
$tag_name = $reader->name;
if ($tag_name == 'record') {
echo '处理完成,当前 $user = ' . json_encode($user, JSON_UNESCAPED_UNICODE) . PHP_EOL . '----------该条记录处理完毕----------' . PHP_EOL . PHP_EOL;
} elseif ($tag_name == 'root') {
echo '文档读取完毕';
}
}
}
输出结果:
文档开始
分页数据:当前是从第1条开始,取3条,共有100条记录
----------开始读取记录----------
初始化 $user ...
处理完成,当前 $user = {"tuIdc":"000001","tuCname":"张三","tuSex":"1"}
----------该条记录处理完毕----------
----------开始读取记录----------
初始化 $user ...
处理完成,当前 $user = {"tuIdc":"000002","tuCname":"李四","tuSex":"1"}
----------该条记录处理完毕----------
----------开始读取记录----------
初始化 $user ...
处理完成,当前 $user = {"tuIdc":"000003","tuCname":"王五","tuSex":"1"}
----------该条记录处理完毕----------
文档读取完毕
方式三:XML Parser
使用XML Parser
:
/**
* @param resource $parser xml解析器
* @param string $tag_name 开始标签名称
* @param array $attributes 标签属性
*/
function startElementHandler($parser, $tag_name, $attributes) {
global $user;
if ($tag_name == 'ROOT') {
echo "文档开始" . PHP_EOL;
} elseif ($tag_name == 'PAGEDATA') {
echo '分页数据:当前是从第' . $attributes['START'] . '条开始,取' . $attributes['LIMIT'] . '条,共有' . $attributes['TOTAL'] . '条记录' . PHP_EOL;
} elseif ($tag_name == 'RECORD') {
echo '----------开始读取记录----------' . PHP_EOL . '初始化 $user ...' . PHP_EOL;
} elseif ($tag_name == 'FIELD') {
$user[$attributes['NAME']] = $attributes['VALUE'];
}
}
/**
* @param resource $parser xml解析器
* @param string $tag_name 标签名称
*/
function endElementHandler($parser, $tag_name) {
global $user;
if ($tag_name == 'RECORD') {
echo '处理完成,当前 $user = ' . json_encode($user, JSON_UNESCAPED_UNICODE) . PHP_EOL . '----------该条记录处理完毕----------' . PHP_EOL . PHP_EOL;
$user = array();
} elseif ($tag_name == 'ROOT') {
echo "文档读取完毕";
}
}
$user = array();
$parser = xml_parser_create();
// 设置元素节点的开始处理函数,和结束处理函数
xml_set_element_handler($parser, 'startElementHandler', 'endElementHandler');
xml_parse($parser, $xml);