我理解如何通过使用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
我确信这里很简单,我在这里缺席,非常感谢任何帮助!
答案 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;。xmlns
属性,并格式化为URL。网址并不指向任何地方,它只是某人拥有&#34;拥有&#34;命名空间。xmlns:nhc="http://www.nhc.noaa.gov"
将前缀nhc:
映射到命名空间http://www.nhc.noaa.gov
->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;