PHP在XML中解析XML

时间:2014-09-10 09:41:50

标签: php xml

我有一个包含XML的XML文件。我如何将所有内容解析为数组或对象?

<DATA>
    <ROW>
        <id>1</id>
        <message_id>123456789</message_id>
        <brand_name>SAMPLE</brand_name>
        <request_xml>
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;Email&gt;
&lt;Service&gt;
&lt;LogMessage/&gt;
&lt;Delivery&gt;
&lt;Synchronous/&gt;
&lt;/Delivery&gt;
&lt;/Service&gt;
&lt;Model&gt;
&lt;Head&gt;
&lt;From&gt;someone@example.com &lt;/From&gt;
&lt;To&gt;someone@sample.com&lt;/To&gt;
&lt;Subject&gt;Your Question&lt;/Subject&gt;
&lt;/Head&gt;
&lt;ns2:ContactUs&gt;
&lt;ns2:Sender&gt;
&lt;ns2:FirstName&gt;John&lt;/ns2:FirstName&gt;
&lt;/ns2:Sender&gt;
&lt;/ns2:ContactUs&gt;
&lt;/Model&gt;
&lt;InlineImages/&gt;
&lt;History/&gt;
&lt;/Email&gt;
        </request_xml>
        <http_status>400</http_status>
        <created_by>admin</created_by>
        <created_on>2014-09-08 01:56:59</created_on>
    </ROW>
</DATA>

我的目标是结束这样的事情:

SimpleXMLElement Object
(
    [ROW] => SimpleXMLElement Object
        (
            [id] => 1
            [message_id] => 123456789
            [brand_name] => SAMPLE
            [request_xml] => SimpleXMLElement Object
                (
                    ...
                    [LogMessage] => 
                    ...
                    [from] => someone@example.com
                    ...
                )

            [http_status] => 400
            [created_by] => admin
            [created_on] => 2014-09-08 01:56:59
        )
)

我没有在我的示例中放置request_xml的所有级别,但是你明白了。基本上我希望像{em}的其余部分一样解析request_xml

我怎么能实现这个目标?提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

如果您读取request_xml元素节点的节点值,结果将解码实体。

$outer = new DOMDocument();
$outer->loadXml($xml);
$xpath = new DOMXpath($outer);

$innerXml = $xpath->evaluate('string(/DATA/ROW/request_xml)');
echo $innerXml;

输出:

<?xml version="1.0" encoding="UTF-8"?>
<Email>
<Service>
<LogMessage/>
...

您可以将内部xml加载到单独的文档对象中。

$inner = new DOMDocument();
$inner->loadXml(trim($innerXml));
echo $inner->saveXml();

但在您的示例中,内部XML已被破坏。它缺少ns2前缀的名称空间定义。如果添加它将起作用:

演示:https://eval.in/191279