如何将xml文件转换为处理ID的数组作为其结构。

时间:2016-12-23 10:23:24

标签: php xml

如此形成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;的内容。

1 个答案:

答案 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)

我希望这有帮助!