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);

发表评论

您的电子邮箱地址不会被公开。