2017-08-30 107 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會自動爲你做轉換。

相關問題