2011-05-16 80 views
3

我想解析一些XML數據以獲得某個屬性的值 - 具體來說,我想找到作者。下面是一個非常簡單但有效的例子。 R節點重複多次。PHP的Xpath提取屬性名稱=「作者」節點的值

<GSP VER="3.2"> 
    <RES SN="1" EN="10"> 
     <R N="4" MIME="application/pdf"> 
      <Label>_cse_rvfaxixpaw0</Label> 
      <PageMap> 
       <DataObject type="metatags"> 
        <Attribute name="creationdate" value="D:20021024104222Z"/> 
        <Attribute name="author" value="Diana Van Winkle"/> 
       </DataObject> 
      </PageMap> 
     </R> 
    </RES> 
</GSP> 

目前我做的:

$XML = simplexml_load_string($XMLResult); 
$XMLResults = $XML->xpath('/GSP/RES/R'); 
foreach($XMLResults as $Result) { 
    $Label = $Result->Label; 
    $Author = ""; // <-- How do I get this? 
} 

可有人請向我解釋,我怎麼能拉出來的「作者」屬性?筆者屬性將出現最大的1次,但可能不會出現在所有的(我可以處理我自己)

回答

4

這裏是解決方案。基本上,您可以關閉結果節點以獲取名稱屬性等於作者的所有屬性元素。

然後您檢查並確保返回結果,如果結果爲真,那麼它將是index [0],因爲XPath調用會返回結果數組。然後,您使用attributes()函數來獲取該屬性的關聯數組,最後獲得所需的值。

$XML = simplexml_load_string($xml_string); 
$XMLResults = $XML->xpath('/GSP/RES/R'); 
foreach($XMLResults as $Result) { 
    $Label = $Result->Label; 
    $AuthorAttribute = $Result->xpath('//Attribute[@name="author"]'); 
    // Make sure there's an author attribute 
    if($AuthorAttribute) { 
     // because we have a list of elements even if there's one result 
     $attributes = $AuthorAttribute[0]->attributes(); 
     $Author = $attributes['value']; 
    } 
    else { 
     // No Author 
    } 
} 
+0

謝謝,那有效 - 你能解釋一下爲什麼你不需要指定節點的路徑?你只是在尋找具有'name =「author」'屬性的任何節點嗎?如果是這樣,那很好,但我只是好奇。乾杯 – Basic 2011-05-16 01:12:05

+0

@Basiclife是的,它正在從當前的''元素的上下文中尋找具有'name =「author」'屬性的任何Attribute節點。 – 2011-05-16 01:13:34

2
$authors = $Result->xpath('PageMap/DataObject/Attribute[@name="author"]'); 
if (count($authors)) { 
    $author = (string) $authors[0]['value']; 
} 
+0

謝謝,選擇節點。也許我不清楚,但我怎樣才能選擇該節點的「價值」的內容?對不起,我對XPath非常陌生 – Basic 2011-05-16 01:07:46

+0

@Basiclife'$ author'被設置爲數組第一個元素的'value'屬性 – Phil 2011-05-16 01:13:19

相關問題