PHP - DOM - XML - 具有相似属性操作的节点

标签 php xml dom dom-manipulation

我必须使用 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/

相关文章:

读取网页源代码并从标签获取属性的 PHP 代码

javascript - 删除无父 HTML 元素

php - 使用图像上传脚本上传文件

php - 使用 PHP 获取字母表中前一个字母的最有效方法

xml - 解析 Wiki XML 转储 ver0.4 变得很困难

java - 如何通过 Java 写入 XML 并通过 HTML 显示它?

javascript - ReactJS - 单击时容器 div 的访问键?

php访问HTTPS和HTTP之间的 session 数据

php - 如何在我的 Linux 服务器中禁用自动文件压缩

java - 如何使用 iText 7(或其他)从 Java 中的 XFA PDF 文档中提取 XML?