如何使用命名空间获取属性的值

时间:2013-05-06 21:54:39

标签: php xml dom xpath

我想获取属性 xsi:schemaLocation 的内容。它与php中的getElementsByTagName完美配合(并且在foreach之后),但它很难看,对吧?

如何使用简单的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>

谢谢!

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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;