我目前正在尝试创建一个通用的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,所以我每次都可以循环使用它。 谢谢你的帮助。
答案 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"
}
}