我正在学习如何使用PHP的简单XML解析XML。我的代码是:
<?php
$xmlSource = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?> <Document xmlns=\"http://www.apple.com/itms/\" artistId=\"329313804\" browsePath=\"/36/6407\" genreId=\"6507\"> <iTunes> myApp </iTunes> </Document>";
$xml = new SimpleXMLElement($xmlSource);
$results = $xml->xpath("/Document/iTunes");
foreach ($results as $result){
echo $result.PHP_EOL;
}
print_r($result);
?>
当它运行时,它返回一个空白屏幕,没有错误。如果我从Document标签中删除所有属性,它将返回:
myApp SimpleXMLElement Object ( [0] => myApp )
预期结果是什么。
我做错了什么?请注意,我无法控制XML源,因为它来自Apple。
答案 0 :(得分:9)
您的xml包含默认命名空间。为了让你的xpath查询工作,你需要注册这个命名空间,并在你要查询的每个xpath元素上使用命名空间前缀(只要这些元素都属于同一个命名空间,他们在你的例子中这样做): / p>
$xml = new SimpleXMLElement( $xmlSource );
// register the namespace with some prefix, in this case 'a'
$xml->registerXPathNamespace( 'a', 'http://www.apple.com/itms/' );
// then use this prefix 'a:' for every node you are querying
$results = $xml->xpath( '/a:Document/a:iTunes' );
foreach( $results as $result )
{
echo $result . PHP_EOL;
}
答案 1 :(得分:2)
有关默认命名空间的部分,请阅读fireeyedboy's answer。如前所述,如果要在默认命名空间中的节点上使用XPath,则需要注册命名空间。
但是,如果您不使用xpath()
,SimpleXML就有自己的魔法,可以自动选择默认命名空间。
$xmlSource = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?> <Document xmlns=\"http://www.apple.com/itms/\" artistId=\"329313804\" browsePath=\"/36/6407\" genreId=\"6507\"> <iTunes> myApp </iTunes> </Document>";
$Document = new SimpleXMLElement($xmlSource);
foreach ($Document->iTunes as $iTunes)
{
echo $iTunes, PHP_EOL;
}
答案 2 :(得分:2)
这是一般例子
foreach ($library->children() as $child)
{
echo $child->getName() . ":\n";
foreach ($child->attributes() as $attr)
{
echo $attr->getName() . ': ' . $attr . "\n";
}
foreach ($child->children() as $subchild)
{
echo $subchild->getName() . ': ' . $subchild . "\n";
}
echo "\n";
}
了解更多信息请查看: http://www.yasha.co/XML/how-to-parse-xml-with-php-simplexml-DOM-Xpath/article-1.html
答案 3 :(得分:0)
这一行:
print_r($result);
在foreach循环之外。也许你应该试试
print_r($results);
代替。
答案 4 :(得分:0)
似乎你在xpath上使用通配符(//)它会起作用。此外,不确定为什么,但如果从Document元素中删除命名空间属性(xmlns),您当前的代码将起作用。也许是因为没有定义前缀?无论如何,以下应该工作:
$results = $xml->xpath("//iTunes");
foreach ($results as $result){
echo $result.PHP_EOL;
}