1

我有一系列任意 XML 文档,我需要对其进行解析并对文档中的每个元素执行一些字符串操作。

例如:

<sample>
  <example>
    <name>David</name>
    <age>21</age>
  </example>
</sample>

对于节点名称和年龄,我可能想通过 strtoupper 之类的函数运行它来更改大小写。

我正在努力以通用的方式做到这一点。我一直在尝试使用 RecursiveIteratorIterator 和 SimpleXMLIterator 来实现这一点,但我无法获取父键来更新 xml 文档:

$iterator = new RecursiveIteratorIterator(new SimpleXMLIterator($xml->asXML()));
foreach ($iterator as $k=> $v) {
    $iterator->$k = strtoupper($v);
}

这失败了,因为此示例中的 $k 是“名称”,因此它正在尝试执行以下操作:

$xml->name = strtoupper($value);

需要的时候

$xml->example->name = strtoupper($value);

随着文档架构的变化,我想使用通用的东西来处理它们,但我不知道如何获取密钥。

这对 Spl 迭代器和 simplexml 可行吗?

4

1 回答 1

1

您很可能正在寻找我曾经用 SimpleXML-Self-Reference措辞的东西。它在这里也有效。

是的,Simplexml 支持 SPL 和RecursiveIteratorIterator.

因此,首先,您可以$xml通过以下方式打开原始 XML 来直接使用树遍历:

$buffer = <<<BUFFER
<sample>
  <example>
    <name>David</name>
    <age>21</age>
  </example>
</sample>
BUFFER;

$xml = simplexml_load_string($buffer, 'SimpleXMLIterator');
//                                     #################

这使您可以进行所有标准修改(SimpleXMLIterator以及 a SimpleXMLElement),还可以进行递归树遍历以修改每个叶节点:

$iterator = new RecursiveIteratorIterator($xml);
foreach ($iterator as $node) {
    $node[0] = strtoupper($node);
    //   ###
}

这个在所有叶节点上的示例性递归迭代显示了如何设置自引用,这里的关键是$node[0]按照上面链接中的概述进行分配。

所以剩下的就是输出:

$xml->asXML('php://output');

然后简单地给出:

<?xml version="1.0"?>
<sample>
  <example>
    <name>DAVID</name>
    <age>21</age>
  </example>
</sample>

这就是整个例子,它也应该回答你的问题。

于 2013-10-31T13:21:04.393 回答