2010-04-18 57 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是你需要的陣列

相關問題