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

时间:2015-11-16 04:34:45

标签: php xml namespaces

请有人解释如何遍历this 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();时,它无效。

请有人帮我调试一下吗?

2 个答案:

答案 0 :(得分:2)

你看错了方法。实际的命名空间(var headTags = $("div#word_content").find("*").filter(function(){ return /^h/i.test(this.nodeName); }); var output = {}; $(headTags).each(function(){ var currentHead = $(this); var nextNextElem = currentHead.next().next(); var innerText = []; if(nextNextElem.prop("tagName") == "UL") { nextNextElem.find("li").each(function(){ innerText.push($(this).text()); }); } output[currentHead.text()] = innerText; }); )就是你所知道的。前缀特定于元素及其后代 - 直到重新定义。它也是元素节点的可选项。以下树元素都具有相同的命名空间:

  • await DoWorkAsync().ConfigureAwait(false);
  • http://schemas.microsoft.com/ado/2007/08/dataservices
  • <f:foo xmlns:f="urn:foo"/>

每个元素都解析为名称空间<bar:foo xmlns:bar="urn:foo"/>内名为<foo xmlns="urn:foo"/>的节点。您可以将其读作foo

如果检查方法的文档,这里有许多具有实际命名空间的参数,因此您不必知道前缀。对于XPath,您可以注册自己的前缀:

urn:foo

输出:

{urn:foo}foo

您必须在要拨打$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"; } 的元素上注册前缀。我在示例中使用了不同的前缀,因此您可以看到您不必知道前缀 - 只有命名空间本身。

在DOM中,它是一个单独的对象,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()

答案 1 :(得分:0)

other question一样,您可以使用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
}