获取XML元素内容而不知道元素名称PHP

时间:2013-09-16 13:50:14

标签: php xml

我目前正在尝试创建一个通用的PHP类来启用XML数据的检索。数据都采用相似的格式,但具有不同的元素名称,有时可能会有更多的元素。示例xml:

一个Feed可能会显示:

<GroupData>
   <Table diff:id="1">
      <Code>1</Code>
      <Name>Red</Name>
      <Type>X</Type>
   </Table>
   <Table diff:id="2">
      <Code>2</Code>
      <Name>Yellow</Name>
      <Type>Y</Type>
   </Table>
</GroupData>

另一个Feed可能会显示:

<GroupData>
   <Table diff:id="1">
      <Code>1</Code>
      <Name>Red</Name>
   </Table>
   <Table diff:id="2">
      <Code>2</Code>
      <Name>Yellow</Name>
   </Table>
</GroupData> 

我的PHP看起来像这样:

$dom = DOMDocument::loadXML($xml);

$node_list = $dom->getElementsByTagName('Table');

for($i=0; $i < $node_list->length; $i++) {

     echo $node_list->item($i)->nodeValue;

}

这会带回数据,但这并不是我想要的。我希望它拆分,这样我就可以看到元素名称和元素值,然后从数据中创建一个数组以供将来使用。有没有办法在不使用“getElementsByTagName”的情况下执行此操作,这是我以前用来获取XML的?我知道我收到的每个Feed都有Table,所以我每次都可以循环使用它。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

getElementsByTagName()看起来合适。代码应如下所示:

$doc = new DOMDocument();
$doc->loadXML($xml);

$tables = $doc->getElementsByTagName('Table');
$data = array();
foreach($tables as $table) {
    $id = $table->getAttribute('id');
    $record = array();
    foreach($table->childNodes as $child) {
        if($child->nodeType === XML_ELEMENT_NODE) {
            $record[$child->nodeName] = $child->nodeValue; 
        }   
    }   
    $data[$id] = $record;
}

var_dump($data);

代码创建一个多维数组,其中第一个维度的索引是表ID,第二个维度是具有XML的键/值对的数组。我已经简化了一点并删除了此示例中的diff:名称空间前缀,因为它们在您显示的代码段中无效(未注册)。在现实世界代码中,您需要getAttributeNS('diff', 'id')代替。

这会给你:

array(2) {
  [1] =>
  array(3) {
    'Code' =>
    string(1) "1"
    'Name' =>
    string(3) "Red"
    'Type' =>
    string(1) "X"
  }
  [2] =>
  array(3) {
    'Code' =>
    string(1) "2"
    'Name' =>
    string(6) "Yellow"
    'Type' =>
    string(1) "Y"
  }
}