【问题标题】:How to get value of an attribute with namespace如何使用命名空间获取属性的值
【发布时间】:2013-05-06 21:54:39
【问题描述】:

我想获取属性 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>

谢谢!

【问题讨论】:

  • 为什么丑? xpath 可能在内部做同样的事情,在具有属性等的循环中搜索元素。

标签: php xml dom xpath


【解决方案1】:

通常,您需要先注册要使用 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);

【讨论】:

  • 如果您选择使用 Rolando 提供的解决方案,请注意我在 cmets 中提到的风险。
【解决方案2】:

使用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;

【讨论】:

  • 请记住,这只有在保证文档使用 xsi 作为 XMLSchema-instance 属性的命名空间前缀时才有效。依赖它通常不是一个好主意。
猜你喜欢
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 2015-07-08
  • 2012-01-22
  • 1970-01-01
  • 2018-06-22
  • 2023-03-09
相关资源
最近更新 更多