而昨晚在使用 XPATH 的時候, 遇到一個問題, 改了一個晚上才搞定, 差點沒吐血. 果然基礎知識要掌握紮實啊!!
假設有以下一份 XML 文檔:
我們要擷取所有歌曲的標題, 一般是使用以下的 XPATH 運算式:
複製代碼 代碼如下:/playlist/trackList/track/title
但是匹配的結果會讓你非常失望, 你會發現什麼也得不到. 於是我在這個問題上卡了好幾個小時, 最終萬能的 Google 告訴了我答案.
在第二行 playlist 那個節點, 有一個 XMLNS 屬性, 這個是 XML 的命名空間 (Namespace), 就是因為這個屬性的存在, 所以我們上面的 XPATH 就無效了. 怎麼辦? 答案是在程式中為我們的 XML 註冊命名空間.
使用 C# 給 XML 註冊命名空間和擷取歌曲標題: 複製代碼 代碼如下:XmlDocument xml = new XmlDocument();
xml.Load("music.xml");
XmlNamespaceManager xnm = new XmlNamespaceManager(xml.NameTable);
xnm.AddNamespace("x", "http://xspf.org/ns/0/");
string xpath = "/x:playlist/x:trackList/x:track/x:title";
foreach (XmlNode xn in xml.SelectNodes(xpath, xnm))
{
Console.WriteLine(xn.InnerText);
}
使用 PHP 給 XML 註冊命名空間和擷取歌曲標題: 複製代碼 代碼如下:$xml = simplexml_load_file('music.xml');
$xml->registerXPathNamespace('x','http://xspf.org/ns/0/');
$xpath = '/x:playlist/x:trackList/x:track';
$result = $xml->xpath($xpath);
foreach($result as $row){
echo $row->title;
}