从xml文件获取节点内容并将其转换为php数组?
问题描述:
我正在寻找解决方案,从大型XML文件中提取一些节点(使用xmlstarlethttp://xmlstar.sourceforge.net/),然后解析此节点到php阵列。从xml文件获取节点内容并将其转换为php数组?
elements.xml
<?xml version="1.0"?>
<elements>
<element id="1" par1="val1_1" par2="val1_2" par3="val1_3">
<title>element 1 title</title>
<description>element 1 description</description>
</element>
<element id="2" par1="val2_1" par2="val2_2" par3="val2_3">
<title>element 2 title</title>
<description>element 2 description</description>
</element>
</elements>
要提取=使用xmlstarlet我执行该shell命令 “1” id为元素标签...
xmlstarlet sel -t -c "/elements/element[id=1]" elements.xml
这个shell命令的输出这样的事情...
<element id="1" par1="val1_1" par2="val1_2" par3="val1_3">
<title>element 1 title</title>
<description>element 1 description</description>
</element>
我怎么能分析这个shell输出到PHP数组?
谢谢。
我发现http://php.net/manual/en/function.simplexml-load-string.php很有用。这个SimpleXML函数会将提取的XML片段转换为SimpleXML对象。
答
你总是可以利用新的输出XML和使用SimpleXML的,如:
$data = '<element id="1" par1="val1_1" par2="val1_2" par3="val1_3">
<title>element 1 title</title>
<description>element 1 description</description>
</element>';
$xml = simplexml_load_string($data);
echo $xml->title; //access title
echo $element_ID = $xml->attributes()->id; //access elements attributes by name
现在$xml
是你需要的阵列
只是好奇,为什么使用xmlstar过类似的SimpleXML或XML DOM? – Jamie 2010-04-18 11:52:25
我的XML文件非常大(〜100Mb)。我不确定Simplexml或XmlDom不会将整个xml文件加载到RAM中(这可能会导致php内存过度使用);但我不确定是否这样说,因为我对解析XML文件的Simplexml机制一无所知。 – Kirzilla 2010-04-18 12:00:33
SimpleXML和DOM几乎完全相同,因为它们使用相同的libxml实现。在dom和simplexml之间切换的函数不仅仅是移交它们的内部xmlNodePtr。所以是的,该文件将在内存中。但是还有其他解析器扩展,例如XMLReader的。 – VolkerK 2010-04-18 12:45:53