2010-04-22 125 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