我必须使用 DOM 操作 XML 文件
这是我的情况:
<mainnode>
<node1 name="aaa">
<subnode name="123456" />
</node1>
<node1 name="bbb">
<subnode name="28472" />
</node1>
<node1 name="aaa">
<subnode name="92328" />
</node1>
<node1 name="ccc">
<subnode name="53554" />
</node1>
<node1 name="ccc">
<subnode name="01928" />
</node1>
<node1 name="aaa">
<subnode name="39576" />
</node1>
<node1 name="ddd">
<subnode name="66666" />
</node1>
</mainnode>
我想将读取 <node1>
中“名称”属性的所有节点分组,以便为每个等于另一个“名称”的“名称”获取类似这样的内容:
<mainnode>
<node1 name="aaa">
<subnode name="123456" />
<subnode name="92328" />
<subnode name="39576" />
</node1>
<node1 name="bbb">
<subnode name="28472" />
</node1>
<node1 name="ccc">
<subnode name="53554" />
<subnode name="01928" />
</node1>
<node1 name="ddd">
<subnode name="66666" />
</node1>
</mainnode>
用 dom 进行这种操作的 php 代码是什么?可能吗?
最佳答案
您可以这样做(请确保您的 XML 之前已规范化):
// load the xml and prepare the dom
$dom = new DOMDocument('1.0', 'UTF-8');
// do not display parsing errors to the user
libxml_use_internal_errors(true)
// load xml
$dom->loadXML($string);
// optionally handle parsing errors provided in libxml_get_errors()
// store the node names
$nodeNames = array();
// get all nodes
$nodes = $dom->getElementsByTagName('node1');
foreach ($nodes as $node)
{
/* @var $node DOMElement */
$nodeName = $node->getAttribute("name");
if (isset($nodeNames[$nodeName]))
{
/* @var $previousNode DOMElement */
$previousNode = $nodeNames[$nodeName];
if ($node->hasChildNodes())
{
foreach ($node->childNodes as $childNode)
{
$previousNode->appendChild($childNode);
}
}
$node->parentNode->removeChild($node);
}
else
{
$nodeNames[$nodeName] = $node;
}
}
关于PHP - DOM - XML - 具有相似属性操作的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9415451/