2016-02-12 100 views
1

您好我有問題在使用名稱空間獲取XML文件中的屬性的值。XPath使用名稱空間來選擇屬性的值

<module name="ietf-inet-types" 
     xmlns="urn:ietf:params:xml:ns:yang:yin:1" 
     xmlns:inet="urn:ietf:params:xml:ns:yang:ietf-inet-types"> 
    <namespace uri="urn:ietf:params:xml:ns:yang:ietf-inet-types"/> 
    <prefix value="inet"/> 
</module> 

我想獲得「inet」作爲我的xpath的結果。我用這個鏈接Xpath to select value of sibling attribute with namespace作爲參考,並想出了:

$xml->xpath('/n:module/n:prefix/@n:value'); 

其中n是命名空間前綴。然而,我得到一個空數組作爲結果,我在這裏做錯了什麼?

更新: 繼承人一些我用來檢索值的php代碼。

//gets the namespace from the model 
$xpathNamespace = getXpathNamespace($domxml); 
$xml = simplexml_load_string($domxml->saveXML()); 
$xml->registerXPathNamespace("n", $xpathNamespace); 
print_r($xml->xpath('/n:module/n:prefix/@n:value')); 

回答

1

在XML屬性沒有命名空間的標籤未在任何命名空間(如value):默認命名空間不應用於屬性。

嘗試的XPath:

/n:module/n:prefix/@value 
+0

嗨我試過,但得到的結果與我使用xpath'/ n:module/n:prefix /'時的結果相同。其結果是:'Array([0] => SimpleXMLElement Object([@attributes] => Array([value] => inet)))' – olliejjc16

+2

@ olliejjc16在這種情況下,您是否可以用代碼更新問題使用(特別是你如何將'n'與XPath處理器中的名稱空間關聯起來:但是使它成爲一個完整的但最小的重新創建)。 – Richard

+1

@ olliejjc16這可能會提供一些指導:[我可以使用SimpleXML和Xpath直接選擇元素屬性嗎?](http://stackoverflow.com/questions/4045600/can-i-use-simplexml-xpath-to-directly -select-an-elements-attribute) – har07

1

確定這裏的解決方案由於對雙方理查德和har07合併的幫助。要訪問前綴的值,我使用Richard建議的以下xpath。從har7發佈的鏈接中的信息中,我訪問了數組中的第一個元素,並將其轉換爲一個字符串,並得到了值「inet」。繼承人代碼:

$prefix = $xml->xpath('/n:module/n:prefix/@value'); 
print_r((string)$prefix[0]); 

感謝雙方的幫助!

相關問題