【发布时间】:2013-07-05 03:03:54
【问题描述】:
我正在尝试解析此 XML 结构,但找不到使用递归解析“n”深度嵌套标签的方法。 xml结构:
<plist version="1.0">
<key>1.1.1</key>
<dict>
<key>nag</key>
<integer>1</integer>
</dict>
<key>2.2.2</key>
<dict>
<key>nag</key>
<integer>1</integer>
</dict>
<key>3.3.3</key>
<dict>
<key>show_upgrade_button</key>
<integer>0</integer>
<key>nag_startup</key>
<dict>
<key>nag_gameover</key>
<integer>3</integer>
</dict>
<key>my_stuff</key>
<string>1=cb 2=rm 3=cb+rm =leave banner ads off</string>
</dict>
<key>4.4.4</key>
<dict>
<key>nag</key>
<integer>1</integer>
</dict>
</plist>
节点匹配 key - dict 是关键节点 dict 节点内的数据的版本号,但 xml 结构具有任意 dict 嵌套,如您在上面的代码中所见。到目前为止,我有这个递归函数,它接受一个 dict 节点,但我看不到光。
<? php
function recursiveNodes($nodes, $arr){
$count=0;
if($nodes->hasChildNodes() === true ){
foreach($nodes->childNodes as $node){
$temp = array();
if($node->nodeName === 'key'){
$temp['key_name'] = $node->nodeValue;
if($node->nextSibling->nodeName !== 'dict'){
$sibling = $node->nextSibling;
$temp['type_name'] = $sibling ->nodeName;
$temp['value_name'] = $sibling ->nodeValue;
}
if($sibling->nodeName === 'dict'){
return recursiveNodes($sibling, $arr[$count++][]=$temp);
}
}
}
}
return $arr;
}
?>
【问题讨论】:
-
你想用这个 XML 做什么?目前尚不清楚您实际递归查找的是什么。
-
你想把这个结构扁平化成一个数组吗?你想用递归数组数据结构来表示它吗?
-
对不起,如果不清楚,我正在尝试获取
keynodeValue,以及下一个key兄弟数据作为数组,我需要将该数据插入到数据库中。假设第一个对, <key>1.1.1</key> <dict> <key>nag</key> <integer>1</integer> </dict>从节点我得到“1.1.1”,从 节点一个数组,其子节点 key_name ="nag" 的以下数据, type_name="integer" 和 type_value="1"。 -
@nickb 是的,问题是我不知道它会有多少嵌套的字典。它可能是dict标签内的一对key-dict,它将有更多的嵌套标签或一对key-anytag,它没有更多的子节点
-
如果递归给您带来 XML 文档的麻烦,请查看 xpath,它通常已经能够返回您,例如一个列表。例如。您可以查询所有以
<key>为兄弟的<dict>元素。
标签: php xml xml-parsing plist domdocument