请有人解释如何循环使用该xml中的<entry>
标记,以便echo
所有带有d:
前缀的元素。
下面的工作,所以我在正确的线路:
$url = "http://www.treasury.gov/resource-center/data-chart-center/interest-rates/pages/XmlView.aspx?data=yieldyear&year=2015";
$xml = simplexml_load_file($url);
foreach( $xml->entry as $entry ) {
$element = $xml->entry->children();
foreach( $element as $name=>$x ) {
echo $name, '=', $x, "'n";
}
}
但我正在为<content>
元素而挣扎。
当我将$element
更新为= $xml->entry->content->children();
时,它不起作用。
有人能帮我调试一下吗?
您的看法不对。实际的名称空间(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";
}
与您的另一个问题一样,您可以使用xpath
:的方法
$xml = simplexml_load_file($url);
foreach ($xml->entry as $entry) { // loop over the entries
print_r($entry->xpath('//d:BC_3MONTH')); // gives you the actual BC_3MONTH
print_r($entry->xpath('//d:Id')); // the actual ID
}