2013-05-06 109 views
1

我想獲取屬性xsi:schemaLocation的內容。它在php(和後面的foreach)中與getElementsByTagName完美配合,但它很醜陋,對吧?如何獲得名稱空間屬性的值

如何使用簡單的Xpath查詢獲取相同的內容?

這裏的XML內容的簡單的例子:

<?xml version="1.0" encoding="utf-8"?> 
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0" creator="blabla" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.groundspeak.com/cache/1/0/1 http://www.groundspeak.com/cache/1/0/1/cache.xsd" xmlns="http://www.topografix.com/GPX/1/0"> 
... 
</gpx> 

謝謝!

+1

爲什麼它很醜? xpath可能會在內部做同樣的事情,搜索具有屬性等的循環中的元素。 – adeneo 2013-05-06 21:58:54

回答

1

使用SimpleXMLElement class您可以輕鬆獲得屬性xsi:schemaLocation的值:

<?php 
$xml = <<<XML 
<?xml version="1.0" encoding="utf-8"?> 
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0" creator="blabla" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.groundspeak.com/cache/1/0/1 http://www.groundspeak.com/cache/1/0/1/cache.xsd" xmlns="http://www.topografix.com/GPX/1/0"> 
</gpx> 
XML; 

$sxe = new SimpleXMLElement($xml); 
$schemaLocation = $sxe->attributes('xsi', true)->schemaLocation; 

echo (string) $schemaLocation; 
+0

請記住,這隻有在文檔保證使用xsi作爲XMLSchema實例屬性的名稱空間前綴時纔有效。依靠它通常不是一個好主意。 – 2013-05-06 22:35:46

+0

謝謝,它的作品! – Surfoo 2013-05-07 08:19:59

3

通常,您需要首先註冊要用於XPath庫的名稱空間。然後您可以通過包含名稱空間前綴以及名稱來查詢屬性。

因此,讓我們假設你正在使用DOMXPath,你可能會註冊下面的命名空間:

$xpath = new DOMXPath($doc); 
$xpath->registerNamespace("xsi","http://www.w3.org/2001/XMLSchema-instance"); 
$xpath->registerNamespace("gpx", "http://www.topografix.com/GPX/1/0"); 

然後你就可以查詢像這樣的東西schemaLocation屬性:

$xpath->query("/gpx:gpx/@xsi:schemaLocation",$doc); 
+0

謝謝,它的工作原理,但我必須使用foreach之後。 – Surfoo 2013-05-07 08:20:58

+0

如果您選擇使用Rolando提供的解決方案,請注意我在評論中提到的風險。 – 2013-05-07 17:13:32

+0

是的,謝謝詹姆斯! – Surfoo 2013-05-12 21:24:50

相關問題