如此形成XML文件:
<?xml version="1.0" encoding="UTF-8" ?>
<archive>
<book id="a">
<chapter id="a.1">
<paragraph id="a.1.1">string 1</paragraph>
<paragraph id="a.1.2">string 2</paragraph>
<paragraph id="a.1.3">string 3</paragraph>
</chapter>
</book>
<book id="b">
<chapter id="b.1">
<paragraph id="b.1.1a">string 4</paragraph>
<paragraph id="b.1.1b">string 5</paragraph>
</chapter>
<chapter id="b.2">
<paragraph id="b.2.1">string 6</paragraph>
</chapter>
</book>
</archive>
我如何在一个如此形成的数组中转换它:
Array
(
[a] => Array
(
[1] => Array
(
[1] => string 1
[2] => string 2
[3] => string 3
)
)
[b] => Array
(
[1] => Array
(
[1a] => string 4
[1b] => string 5
)
[2] => Array
(
[1] => string 6
)
)
)
注意: a)数组基于从xml文件的所有元素获取的ID(gerarchy-structured)。 b)ID是字母数字,DOT定义&#34; level / gerarchy&#34;的内容。
答案 0 :(得分:1)
这是一个快速的黑客,适用于您的示例。 基本上我搜索所有xml叶子或段落并构建数组。从那些叶子中我取父母和父母的父母并得到他们的ID。
如果您的xml在$xml
内,则此代码应该有效:
$result = [];
$dom = new DOMDocument();
$dom->loadXML($xml);
foreach ((new DOMXPath($dom))->evaluate('//*[count(*) = 0]') as $node) {
$chapterId = end(explode(".", $node->parentNode->getAttribute('id')));
$bookId = $node->parentNode->parentNode->getAttribute('id');
if (!isset($result[$bookId])) {
$result[$bookId] = [];
}
if (!isset($result[$bookId][$chapterId])) {
$result[$bookId][$chapterId] = [];
}
$result[$bookId][$chapterId ][end(explode(".", $node->getAttribute('id')))] = $node->nodeValue;
}
var_dump($result);
将输出:
array (size=2)
'a' =>
array (size=1)
1 =>
array (size=3)
1 => string 'string 1' (length=8)
2 => string 'string 2' (length=8)
3 => string 'string 3' (length=8)
'b' =>
array (size=2)
1 =>
array (size=2)
'1a' => string 'string 4' (length=8)
'1b' => string 'string 5' (length=8)
2 =>
array (size=1)
1 => string 'string 6' (length=8)
我希望这有帮助!