-1

我正在尝试解析以下 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 作为来自 Web 服务的响应。

4

3 回答 3

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);
    
于 2012-12-28T05:01:20.177 回答
0

为什么不更正 XML?

IE

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

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

   <person name="Alex" />
 </people>
于 2012-12-28T04:59:21.970 回答
0

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

这是一个 xpath 方法:

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

foreach ($people as $person) {
    echo $person['name'], "\n";
}
于 2012-12-28T05:02:26.147 回答