如何从数组中将节点添加到多级XML? - php

我有一个数组$arr=array("A-B-C-D","A-B-E","A-B-C-F"),XML的预期输出应为

<root>
    <A>
        <B>
            <C>
                <D></D>
                <F></F>
            </C>
            <E></E>
        </B>
    </A>
</root>

我已经完成了为第一个数组元素即A-B-C-D创建XML新节点的代码。但是当我移到第二个元素时,我需要检查已经创建了多少个节点(A-B),然后在适当的位置基于该节点添加新节点。

那么,如何遍历XML并找到应该附加新节点的确切位置?

我当前的代码如下所示

$arr=explode("-",$input);    
$doc = new DomDocument();

$doc->formatOutput=true;
$doc->LoadXML('<root/>');
$root = $doc->documentElement;
$comm = $doc->createElement('comm');
$root->appendChild($comm);
foreach($arr as $a2) {
    $newcomm = $doc->createElement($a2);
    $community->appendChild($newcomm);
    $community=$newcomm;
}

我应该使用xpath还是其他一些方法会更容易?

参考方案

为了坚持使用DOMDocument,我添加了一个额外的循环,使您可以在其中添加所有原始数组项。主要是在添加新项之前,检查它是否已经存在...

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

$set=array("A-B-C-D","A-B-E","A-B-C-F-G", "A-B-G-Q");
$doc = new DomDocument();

$doc->formatOutput=true;
$doc->LoadXML('<root/>');
foreach ( $set as $input ) {
    $arr=explode("-",$input);    
    $base = $doc->documentElement;
    foreach($arr as $a2) {
        $newcomm = null;
        // Decide if the element already exists.
        foreach ( $base->childNodes as $nextElement )   {
            if ( $nextElement instanceof DOMElement 
                    && $nextElement->tagName == $a2 )   {
                $newcomm = $nextElement;
            }
        }
        if ( $newcomm == null )   {
            $newcomm = $doc->createElement($a2);
            $base->appendChild($newcomm);
        }
        $base=$newcomm;
    } 
}
echo $doc->saveXML();

由于没有一种快速的方法(据我所知)来检查具有特定标签名称的子项,因此它只是通过所有子元素查找具有相同名称的DOMElement。

我开始使用getElementByTagName,但这会找到具有名称的子节点,而不仅仅是当前级别。

上面的输出是...

<?xml version="1.0"?>
<root>
  <A>
    <B>
      <C>
        <D/>
        <F>
          <G/>
        </F>
      </C>
      <E/>
      <G>
        <Q/>
      </G>
    </B>
  </A>
</root>

我添加了其他一些项目,以表明它在正确的位置添加了内容。

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

PHP-复选框组 - php

我有一个需要发布的表单复选框组。<input type="checkbox" value="true" checked name="chk0[]"> <input type="checkbox" value="false" name=…

当使用jquery的id做某事时,id可以来自任何一种标记吗? - php

我是JQuery的新手,我正尝试使用PHP,HTML和JQuery编写代码。我想用具有ID的标签替换HTML中的所有<?php echo $var; ?>。例如,我想使用<div id="name"></div>之类的东西,然后使用$("#name")将其显示在该div字段中。我的问…

PHP中奇怪的sprintf行为 - php

我试图做sprintf("<%s>", "Sat");,但是什么也没出现。当您删除小于符号时,它将再次开始工作。任何人都经历过这种行为以及是否会发生这种情况?因为我认为这是一个错误。您甚至可以在这里使用printf .....获得相同的结果。http://writecodeonline.com/php/ 参…

jQuery不起作用 - php

我正在使用带有ajax的jquery。有时,给出错误$未定义。这是我的代码:<script language="javascript" type="text/javascript"> var base_path="<? echo $this->baseUrl().'/…