1

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

一个提要可能会显示:

<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>

另一个提要可能会显示:

<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 的方法?我知道我收到的每个提要都有表格,所以我每次都可以循环播放。谢谢您的帮助。

4

1 回答 1

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"
  }
}
于 2013-09-16T14:04:36.917 回答