2010-04-22 169 views
2

以下是XML示例代碼。通過PHP解析XML屬性XMLReader

<m:ad xmlns:m="http://www.w3c.org/soap"> 
    <title><![CDATA[TITLE]]></title> 
    <phone>123456789</phone> 
    <attributeGroup> 
     <attribute id="14" name="A1">40</attribute> 
     <attribute id="15" name="A2">50</attribute> 
    </attributeGroup> 
</m:ad> 

我只知道PHP的XMLReader獲得價值

$reader = new XMLReader();   
if ($reader->name == "title" && $reader->nodeType ==XMLReader::ELEMENT) { 
    echo $reader2->read(); // will get TITLE 
} 

可是如何才能讓屬性A1,A2。我想得到40和50。

回答

5
$reader = new XMLReader(); 
$reader->xml('<m:ad xmlns:m="http://www.w3c.org/soap"> 
    <title><![CDATA[TITLE]]></title> 
    <phone>123456789</phone> 
    <attributeGroup> 
     <attribute id="14" name="A1">40</attribute> 
     <attribute id="15" name="A2">50</attribute> 
    </attributeGroup> 
</m:ad>'); 


while ($reader->read()) { 
    if ( $reader->nodeType ==XMLReader::ELEMENT && $reader->name == "attribute") { 
    printf("id=%s, name=%s\n", $reader->getAttribute('id'), $reader->getAttribute('name')); 
    } 
} 

打印

id=14, name=A1 
id=15, name=A2 
+0

+1,但如果我不知道哪個屬性將提供? – SDC 2012-06-21 14:45:05

+0

SDC:這個問題有點過於寬泛,我不能回答。你想達到什麼目的?可能是模式是你要找的東西,或者類似odata,甚至可能是通過XSL(t)進行轉換的答案......或者完全不同的東西;-) – VolkerK 2012-07-06 08:20:02

+5

我最終使用了'$ reader- > attributeCount',然後使用'for()'循環依次使用$ reader-> moveToAttributeNo()'讀取每個屬性。這使我可以訪問所有屬性,而無需事先知道它們會是什麼。 – SDC 2012-07-06 09:55:15