【发布时间】:2021-11-01 05:32:14
【问题描述】:
我正在尝试从一个巨大的 XML 文件中检索一个基于 <id> 元素的特定节点。我使用过 DOMDocument,但它并不理想,因为它首先加载整个文档。文档中有大约 1400 个<item> 节点。这是文档的简化版本:
<main>
<body>
...
<sub>
...
<items>
...
<item>
<name>Abc</name>
...
<id>123</id>
<calls>
<call>
<name>Monkey</name>
<text>Monkeys r cool</text>
...
</call>
<call>
<name>Pig</name>
<text>Pigs too!</text>
...
</call>
</calls>
<cones>
<cone>
<name>Lorem</name>
<text>Lorem ipsum</text>
...
</cone>
<cone>
<name>More</name>
<text>Placeholder</text>
...
</cone>
</cones>
<a>true</a>
</item>
<item>
<name>Def</name>
...
<id>456</id>
<calls>
<call>
<name>aa</name>
<text>aa</text>
...
</call>
<call>
<name>bb</name>
<text>bb</text>
...
</call>
</calls>
<cones>
<cone>
<name>cc</name>
<text>cc</text>
...
</cone>
<cone>
<name>dd</name>
<text>dd</text>
...
</cone>
</cones>
<a>true</a>
</item>
</items>
</sub>
</body>
</main>
所以基本上我试图通过匹配<id> 元素来检索当前节点及其子节点的数据。我曾尝试在 XMLReader 上查找教程,但似乎找不到那么多。这是我迄今为止尝试过的:
$xml = new XMLReader();
$xml->open('doc.xml');
while($xml->read()) {
if($xml->nodeType == XMLREADER::ELEMENT && $xml->localName == 'id') {
$xml->read();
echo $xml->value;
}
}
这会找到每个 <id> 元素,但我想找到一个特定的并从当前节点及其子节点读取数据。也许使用示例查找节点和readInnerXml() 获取数据
我不是专家,因此非常感谢任何帮助/推动正确方向:D
【问题讨论】:
-
您可以使用 XMLReader 和 DOMDocument 的混合方法。例如,您到达第一个项目,用它创建一个 DOMNode(使用 XMLReader::expand),将它附加到 DOMDocument 实例并检查 id 是否正确。如果不是,请使用 XMLReader::next 跳转到下一项。
-
@CasimiretHippolyte 实际上您不需要附加(和删除)节点。只需将其展开为准备好的文档并使用上下文参数进行 Xpath 调用。
-
@ThW:我不知道可以在 DOM 树的“外部”使用 XPath(即使使用上下文参数)。如果您不必为每个项目附加或替换节点,它确实更轻。干得好。