这是我的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()
为 <entry xmlns="http://www.w3.org/2005/Atom">
创建的,为了引用它 //atom:entry/atom:content/meta:properties
,因为条目标签不使用前缀,这是有道理的 .
为什么创建了 meta
前缀?已经有一个 m:
前缀定义了相同的命名空间 .
使用下面会做同样的事情吗?
//atom:entry/atom:content/m:properties
不幸的是,直到今天晚些时候我才能访问我的服务器 . 我会自己测试一下 . 如果它不起作用,为什么不更感兴趣,逻辑会建议它应该?
2 回答
m:
前缀绑定在XML实例中,但您的XPath处理器不知道这一点 . 它需要单独绑定(注册)前缀 .meta:
前缀是任意的 . 它可能就像XML一样m:
,但没关系 . 只要URI是相同的 .atom:
前缀可能是a:
,它仍然有效 .可能这会对你有所帮助 . 我在网上找到的命名空间最佳指南 .
https://www2.informatik.hu-berlin.de/~xing/Lib/NamespacesFAQ.htm#q8_5