2010-04-18 108 views
1

我正在寻找解决方案,从大型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对象。

+0

只是好奇,为什么使用xmlstar过类似的SimpleXML或XML DOM? – Jamie 2010-04-18 11:52:25

+0

我的XML文件非常大(〜100Mb)。我不确定Simplexml或XmlDom不会将整个xml文件加载到RAM中(这可能会导致php内存过度使用);但我不确定是否这样说,因为我对解析XML文件的Simplexml机制一无所知。 – Kirzilla 2010-04-18 12:00:33

+0

SimpleXML和DOM几乎完全相同,因为它们使用相同的libxml实现。在dom和simplexml之间切换的函数不仅仅是移交它们的内部xmlNodePtr。所以是的,该文件将在内存中。但是还有其他解析器扩展,例如XMLReader的。 – VolkerK 2010-04-18 12:45:53

回答

1

你总是可以利用新的输出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是你需要的阵列

相关问题