你看错了。实际的命名空间 (http://schemas.microsoft.com/ado/2007/08/dataservices) 就是您所知道的。前缀特定于元素及其后代 - 直到它被重新定义。它对于元素节点也是可选的。以下树元素都具有相同的命名空间:
<f:foo xmlns:f="urn:foo"/>
<bar:foo xmlns:bar="urn:foo"/>
<foo xmlns="urn:foo"/>
每个元素都解析为命名空间urn:foo 内名称为foo 的节点。你可以读成{urn:foo}foo。
如果您查看方法的文档,这里有许多方法具有实际的命名空间参数,因此您不必知道前缀。对于 XPath,您可以注册自己的前缀:
$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/dataservices/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";
}
输出:
6257
2015-01-02T00:00:00
6258
2015-01-05T00:00:00
6259
2015-01-06T00:00:00
6260
2015-01-07T00:00:00
6261
2015-01-08T00:00:00
...
您必须在要调用xpath() 的元素上注册前缀。我在示例中使用了不同的前缀,因此您可以看到您不必知道前缀 - 只需知道命名空间本身。
在 DOM 中它是一个单独的对象,DOMXpath:evaluate() 可以直接返回标量值。
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('atom', 'http://www.w3.org/2005/Atom');
$xpath->registerNamespace('meta', 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata');
$xpath->registerNamespace('data', 'http://schemas.microsoft.com/ado/2007/08/dataservices');
foreach ($xpath->evaluate('//atom:entry/atom:content/meta:properties') as $properties) {
echo $xpath->evaluate('string(data:Id)', $properties), "\n";
echo $xpath->evaluate('string(data:NEW_DATE)', $properties), "\n\n";
}