使用PHP的simpleXML解析XML

时间:2010-03-05 12:01:32

标签: php simplexml app-store itunes

我正在学习如何使用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。

5 个答案:

答案 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;  
}