【问题标题】:Using XML prefixes/namespaces to create an Xpath使用 XML 前缀/命名空间创建 Xpath
【发布时间】:2015-11-19 16:40:36
【问题描述】:

这是我的prior question 的后续。我想我已经深入了解了,所以花了一些时间完全理解 XML 命名空间。

来自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 前缀是使用registerXPathNamespace()&lt;entry xmlns="http://www.w3.org/2005/Atom"&gt; 创建的,以便像//atom:entry/atom:content/meta:properties 这样引用它,这对我来说是有道理的,因为入口标签不使用前缀。

为什么要创建 meta 前缀?已经有一个 m: 前缀定义了相同的命名空间。

使用下面的会做同样的事情吗?

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

很遗憾,直到今天晚些时候我才能访问我的服务器。那我自己测试一下。如果它不起作用,更感兴趣的是为什么不,逻辑会建议它应该?

【问题讨论】:

标签: xml xpath namespaces


【解决方案1】:

m: 前缀绑定在 XML 实例中,但您的 XPath 处理器不知道这一点。它需要单独绑定(注册)前缀。

meta: 前缀是任意的。就像 XML 一样,它可能是 m:,但这并不重要。只要 URI 相同。 atom: 前缀可能是 a:,它仍然可以工作。

【讨论】:

  • 很好的答案,谢谢!你的 SQL 怎么样? :) 如果我要尝试将元素与 MySQL 表行匹配,这种 xPath 方法是否相同?再问:stackoverflow.com/questions/33771883/…
  • 抱歉@Pete 我的 SQL 经验有限。
【解决方案2】:

这可能会对你有所帮助。我在网上找到的关于命名空间的最佳指南。

https://www2.informatik.hu-berlin.de/~xing/Lib/NamespacesFAQ.htm#q8_5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    相关资源
    最近更新 更多