2017-08-30 108 views
1

获取XML节点我有以下XML结构:通过属性名称

<Folder> 
     <Placemark> 
     <ExtendedData> 
      <Data name="Id"> 
      <value>152285415</value> 
      </Data> 
      <Data name="Name"> 
      <value>Tester</value> 
      </Data> 
     </ExtendedData> 
     </Placemark> 
    </Folder> 

,我需要直接访问的-object与属性“名” =“ID”。

所以,我想这一点:

$xml->Document->Folder->Placemark->ExtendedData->xpath('data[@name="Id"]') 

但给人和空数组。

我到底需要什么是“152285415”

任何帮助表示赞赏。

+0

我想你错过了你的问题中的关键词。你想得到什么输出? – Chris

+0

@RaphaelJeger你应该通过接受答案来解决这个问题。 – ishegg

+0

@ishegg你是对的,刚刚完成! Thx –

回答

1

您可以使用XPath来访问你直接想要的东西:

<?php 
$xml = '<Folder> 
     <Placemark> 
     <ExtendedData> 
      <Data name="Id"> 
      <value>152285415</value> 
      </Data> 
      <Data name="Name"> 
      <value>Tester</value> 
      </Data> 
     </ExtendedData> 
     </Placemark> 
    </Folder>'; 

$xml = new SimpleXMLElement($xml); 
$result = $xml->xpath('/Folder/Placemark/ExtendedData/Data[@name="Id"]'); 
echo "Value: ".$result[0]->value; // Value: 152285415 

Demo

1

这似乎做的工作:

<?php 

$xml = '<Folder> 
     <Placemark> 
     <ExtendedData> 
      <Data name="Id"> 
      <value>152285415</value> 
      </Data> 
      <Data name="Name"> 
      <value>Tester</value> 
      </Data> 
     </ExtendedData> 
     </Placemark> 
    </Folder>'; 

$xml = simplexml_load_string($xml); 

foreach($xml->Placemark->ExtendedData->Data as $item) { 

    if($item->attributes()['name'] == 'Id') { 
     echo $item->value; 
    } 

} 
+0

当然,它的确如此。然而直接访问这个对象而没有循环会更好,你不觉得吗? –

+0

它会。希望有人比我更有天赋能提供更好的答案,然后我可以向他们学习! – Chris

0

不用担心的整体层次文档(虽然这被滥用了很多)是使用//作为XPath的第一部分。因此该查询可以写成...

<?php 
error_reporting (E_ALL); 
ini_set ('display_errors', 1); 

$xmlDoc = <<<XML 
<Folder> 
    <Placemark> 
    <ExtendedData> 
     <Data name="Id"> 
     <value>152285415</value> 
     </Data> 
     <Data name="Name"> 
     <value>Tester</value> 
     </Data> 
    </ExtendedData> 
    </Placemark> 
</Folder> 
XML; 

$xml = new SimpleXMLElement($xmlDoc); 
$value = $xml->xpath('//Data[@name="Id"]/value')[0]; 
echo "Value=".$value.PHP_EOL; 

虽然注意$值仍然是一个SimpleXMLElement对象,所以如果你需要它作为一个字符串,你应该使用(string)$value。在这个例子中,echo会自动为你做转换。

相关问题