将 XMLWriter 实例添加到另一个实例中

问题描述 投票:0回答:1

我们用这个虚拟结构来讨论一下问题:

$data = [
  'lvl1' => [
    'lvl2' => [
      'lvl3' => 'data3'
    ],
    'val2' => 'data2'
  ]
];

我正在使用 PHP XMLWriter 类在内存中创建文档:

$xml = new XMLWriter();
$xml->openMemory();
$xml->startDocument();
$xml->startElement('p');
$xml->text("Test");
$xml->endElement();
recursiveNodes($data, $xml);
$xml->endDocument();
print($xml->outputMemory());

函数应该递归地处理数据数组:

function recursiveNodes(array $data, XMLWriter $xml) : XMLWriter
{
  foreach ($data as $node) {
    if (is_array($node)) {
      recursiveNodes($node, $xml);
    } else {
      $xml->writeElement($node);
    }
  }
  return $xml;
}

现在,在我的代码中,我想使用一些递归函数,在“

”节点之后添加节点。

由于递归调用的性质,最后一个(最深的)节点将首先添加到 XML 结构中,但其顺序应与数据出现的顺序相同。

php xmlwriter
1个回答
0
投票

XMLWriter 是按顺序写入的,递归地使用它的协议需要将其与 XML 文档结构对齐。

例如当调用

writeElement()
时,它会写入一个元素,即叶节点。

当调用

startElement()
...
endElement()
时,它将写入一个父节点。

当您想使用递归函数通过递归遍历来装饰

$data
结构时,您的例程只有叶节点部分:

    if (is_array($node)) {
      recursiveNodes($node, $xml);
    } else {
      $xml->writeElement($node);
    }

因此父节点丢失。从你的问题中我并不完全清楚,但也许从密钥中将其包装为

$data
可能已经足够了:

  foreach ($data as $node => $children) {
    $xml->startElement($node);
    if (is_array($children)) {
      ...
    }
    $xml->endElement();
  }

备注:

$node
现在是 key,之前同一个变量名下的 value 现在是
$children
变量。

© www.soinside.com 2019 - 2024. All rights reserved.