我有一个包含XML的XML文件。我如何将所有内容解析为数组或对象?
<DATA>
<ROW>
<id>1</id>
<message_id>123456789</message_id>
<brand_name>SAMPLE</brand_name>
<request_xml>
<?xml version="1.0" encoding="UTF-8"?>
<Email>
<Service>
<LogMessage/>
<Delivery>
<Synchronous/>
</Delivery>
</Service>
<Model>
<Head>
<From>someone@example.com </From>
<To>someone@sample.com</To>
<Subject>Your Question</Subject>
</Head>
<ns2:ContactUs>
<ns2:Sender>
<ns2:FirstName>John</ns2:FirstName>
</ns2:Sender>
</ns2:ContactUs>
</Model>
<InlineImages/>
<History/>
</Email>
</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
。
我怎么能实现这个目标?提前感谢您的帮助!
答案 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前缀的名称空间定义。如果添加它将起作用: