如何用simplexml解析xml?

时间:2012-12-28 04:42:51

标签: php simplexml

我正在尝试解析以下xml,但是我的代码自动解析了每个部分的第一个标记,

$xml = simplexml_load_string($response);       
foreach ($xml->person as $p) {
  $p = $p->attributes()->name;
  echo "     ".$p. "        ";
}

输出是Joe Ray Alex,但我需要它来显示列表中每个人的名字,所以它应该是Joe Jack Ray John Edward Alex。

 <?xml version="1.0" encoding="utf-8"?>
 <people>
   <person name="Joe">
   <person name="Jack">
   </person>
   </person>

   <person name="Ray">
   <person name="John">
   <person name="Edward">
   </person>
   </person>

   <person name="Alex">
   </person>
 </people>

还有其他选择而不是更改xml吗? 因为我收到了来自网络服务的响应的xml。

3 个答案:

答案 0 :(得分:1)

  1. 修复您的XML

  2. 如果你真的想要打印内部元素数据,你应该创建一个递归函数:

    function printNames($simpleXMLElement) {
    
        // Print the name attribute of each top level element
        foreach ($simpleXMLElement as $element) {
    
            // Print this elements name.
            $p = $simpleXMLElement->attributes()->name;
            echo "     ".$p."        ";
    
            // Send the inner elements to get their names printed
            foreach ($simpleXMLElement->children() as $child) {
                printNames($child);
            }
        }
    }
    
    
    $xml = simplexml_load_string($response);
    printNames($xml);
    

答案 1 :(得分:0)

为什么不更正XML?

<people>
   <person name="Joe" />
   <person name="Jack" />

   <person name="Ray" />
   <person name="John" />
   <person name="Edward" />

   <person name="Alex" />
 </people>

答案 2 :(得分:0)

鉴于您奇怪的XML结构,您必须查找并递归到您找到的任何person元素,或者您需要生成所有person元素的平面列表。

这是一个xpath方法:

$people = $xml->xpath('descendant::person');

foreach ($people as $person) {
    echo $person['name'], "\n";
}