使用PHP从命名空间元素中检索XML值


Retrieving XML values from namespace elements with PHP

请有人解释如何循环使用该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
}