如何使用:simplexml

时间:2017-06-27 17:40:53

标签: php parsing simplexml

我理解如何通过使用simplexml解析来调用.xml文档中的子项,但是我在调​​用名称如下的子项时遇到问题:name2。

更具体地说,我试图回应这个.xml文档中的nhc:center:http://www.nhc.noaa.gov/nhc_ep4.xml

目前我的代码如下:

<?php
$xml=simplexml_load_file("http://www.nhc.noaa.gov/nhc_ep4.xml") or die("Error: Cannot create object");
echo $xml->channel->title[0] . "<br>";
echo $xml->channel->description[0] . "<br><br>";
echo $xml->channel->item[0]->nhc:Cyclone->nhc:center . "<br>";
?>

前三行完美无缺,但在尝试调用nhc:center:

时返回此错误
  

解析错误:   语法错误,意外':',期待','或';'在   第5行的C:\ xampp \ htdocs \ test.php

我确信这里很简单,我在这里缺席,非常感谢任何帮助!

3 个答案:

答案 0 :(得分:0)

冒号在裸对象属性名称中无效,因此您必须引用它们:

$xml->channel->item[0]->{'nhc:Cyclone'}->{'nhc:center'}

答案 1 :(得分:0)

修改2

这个答案被接受后的第二天,一个较少的&#34; hacky&#34;答案发布在这里:https://stackoverflow.com/a/44813107/713874

原始回复

尝试用卷括号和引号括起名称,如下所示:

echo $xml->channel->item[0]->{'nhc:Cyclone'}->{'nhc:center'} . "<br>";

来源: How do I access this object property with a hyphenated name?

编辑:我发现您的域名都是公开的,并且看到它仍然没有抓住您的信息。奇怪的。我确实找到了解决它的解决办法:

$xml = simplexml_load_string(str_replace("nhc:", "nhc", file_get_contents("http://www.nhc.noaa.gov/nhc_ep4.xml")));

答案 2 :(得分:-1)

这已被问过数百次,但答案往往是误导或过于具体,所以既然我找不到一个很好的规范答案来将此标记为重复,这里还有另一个摘要:

  • 标记名称中的冒号(:)表示该标记位于&#34;命名空间中#34;。
  • 冒号前面的部分是&#34;命名空间前缀&#34 ;;它是本特定文档的本地文档,如果文档的含义发生变化(例如文件是由不同的应用程序生成或处理的话),可能会在没有通知的情况下进行更改。
  • &#34;名称空间标识符&#34;映射到此文件顶部的xmlns属性,并格式化为URL。网址并不指向任何地方,它只是某人拥有&#34;拥有&#34;命名空间。
  • 在这种情况下,xmlns:nhc="http://www.nhc.noaa.gov"将前缀nhc:映射到命名空间http://www.nhc.noaa.gov
  • 在SimpleXML中,使用the ->children() method访问命名空间中的元素,使用the ->attributes() method访问命名空间中的属性。这些&#34;开关&#34;您在使用->foo['bar']等时所看到的命名空间
  • 你可以使用前缀作为->children()->attributes()的参数,但正如我所说,这可能会改变,所以我通常做的是在URL的某处设置一个常量,所以我有我自己的短标识符,不必将URL粘贴到多个位置。

长话短说,你需要写下这个:

// Define a constant to refer to the namespace
// could be a variable, a class constant, or whatever you like
define('XMLNS_NHC', 'http://www.nhc.noaa.gov');

// Use ->children() to switch to that namespace
echo $xml->channel->item[0]->children(XMLNS_NHC)->Cyclone->center;