2015-11-19 96 views
2

這是我的prior question的後續內容。我想我深入瞭解了所以花了一些時間充分理解XML名稱空間。使用XML前綴/名稱空間創建Xpath

this XML頁,會聚焦爲分鐘以下元件上:

<m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> 

據我所知,m:前綴是爲了所述properties元件從元件與其他相同的名稱區分被用於文件,以防文件合併。 我明白,爲了使用前綴,必須定義該前綴的命名空間。這樣的定義是使用XML名稱空間屬性(xmlns)完成的,語法是xmlns:prefix="URI"。 URI是Uniform Resource Identifier,它基本上是元素的來源。 URI過去被稱爲Uniform Resource Names (URN),它們本質上是相同的。

現在考慮看看回答我之前問:

$url = "http://www.treasury.gov/resource-center/data-chart-center/interest-rates/pages/XmlView.aspx?data=yieldyear&year=2015"; 
$element = simplexml_load_file($url); 

$element->registerXPathNamespace(
    'atom', 'http://www.w3.org/2005/Atom' 
); 
$element->registerXpathNamespace(
    'meta', 'http://schemas.microsoft.com/ado/2007/08/dataservice/metadata' 
); 

foreach ($element->xpath('//atom:entry/atom:content/meta:properties') as $properties) { 
    $properties->registerXpathNamespace('data', 'http://schemas.microsoft.com/ado/2007/08/dataservices'); 
    echo $properties->xpath('data:Id')[0], "\n"; 
    echo $properties->xpath('data:NEW_DATE')[0], "\n\n"; 
} 

XPath是定義XML文檔的部分語法。 registerXPathNamespace()函數爲指定的名稱空間創建一個前綴。

這對我來說很有意義,爲什麼​​前綴是爲了像這樣引用它//atom:entry/atom:content/meta:properties原因是該條目標籤不使用前綴使用registerXPathNamespace()<entry xmlns="http://www.w3.org/2005/Atom">創建。

爲什麼要創建meta前綴?已經有一個m:前綴,其中定義了相同的名稱空間。

會用下面的方法做同樣的事情嗎?

//atom:entry/atom:content/m:properties 

不幸的是,我今天晚些時候才能訪問我的服務器。那麼我會自己測試一下。如果它不起作用,更關心爲什麼不,邏輯會建議它應該?

+0

下一個問題:http://stackoverflow.com/questions/33771883/name-sql-table-rows-to-match-xml-namespace-elements – DVCITIS

回答

3

m:前綴綁定在XML實例中,但您的XPath處理器不知道這一點。它需要單獨綁定(註冊)的前綴。

meta:前綴是任意的。它可能是m:就像XML一樣,但沒關係。只要URI是相同的。前綴atom:可能是a:,它仍然可以工作。

+0

偉大的答案,謝謝!你的SQL如何? :)是否這個xPath方法是一樣的,如果我嘗試使用MySQL表格行匹配元素?有另一個Q:http://stackoverflow.com/questions/33771883/name-sql-table-rows-to-match-xml-namespace-elements – DVCITIS

+0

對不起@Pete我的SQL經驗是有限的。 –