将以前的顶级节点添加到新的顶级节点SimpleXML中


adding previous top level node inside a new top level node SimpleXML

我有一个XML文件,如下所示:

<?xml version="1.0"?>
<export>
  <config>
    <Exported Name="test">
      <values>
        <node name="yellow" />
        <node name="green" />
        <node name="red" />
      </values>
    </Exported>
  </config>
</export>

虽然我知道如何根据SimpleXML的PHP文档添加属性http://www.php.net/manual/en/simplexmlelement.addattribute.php

我不确定是否可以将我所拥有的东西包装在另一个标签中。示例我想将上面的更改为:

<?xml version="1.0"?>
<main>
   <cust>
       johndoe@gmail.com
   </cust>
   <export>
      <config>
        <Exported Name="test">
          <values>
            <node name="yellow" />
            <node name="green" />
            <node name="red" />
          </values>
        </Exported>
      </config>
   </export>
</main>

因此,基本上我所做的是创建一个名为main的新顶级节点,并放置一个新的属性cust,添加一个值,然后在cust属性之后在主节点内添加上一个顶级节点导出。

理想情况下,我想使用simpleXML,但我想知道最好的方法是什么,从导出中读取所有内容,并将其全部吐回一个循环中,这样做的最佳方法是什么?或者有没有一种方法可以说在这里打印所有导出节点,而不是几乎读取整个XML,然后必须循环并重新构建它,只添加2个新节点?

这不适用于SimpleXML,但适用于允许将节点从一个文档递归导入到另一个文档的DOMDocument。幸运的是,SimpleXML只是PHP中DomDocument之上的一个门面,节点可以从SimpleXML导入DOM,然后在DOM中从一个文档导入另一个文档:

$xml = new SimpleXMLElement('<?xml version="1.0"?>
<export>
  <config>
    <Exported Name="test">
      <values>
        <node name="yellow" />
        <node name="green" />
        <node name="red" />
      </values>
    </Exported>
  </config>
</export>');
$target = new SimpleXMLElement('<?xml version="1.0"?>
<main>
   <cust>
       johndoe@gmail.com
   </cust>
</main>');
$cust = dom_import_simplexml($target->cust);
$cust->parentNode->appendChild(
    $cust->ownerDocument->importNode(dom_import_simplexml($xml), true)
);
$target->asXML('php://output');

输出:

<?xml version="1.0"?>
<main>
   <cust>
       johndoe@gmail.com
   </cust>
<export>
  <config>
    <Exported Name="test">
      <values>
        <node name="yellow"/>
        <node name="green"/>
        <node name="red"/>
      </values>
    </Exported>
  </config>
</export></main>

SimpleXML似乎不允许这样的操作。它很容易用简单的文本替换节点内容;

$xml->config->Exported->values = 'Nodes were here.';

但是,如果我尝试使用这种方式放置XML或SimpleXMLElement,我会失败。

$xml->config->Exported->values = '<a>asd</a>';

生产«&lt;a&gt;asd&lt/a&gt;»。我还尝试调用SimpleXMLElement的concstructor,使节点内容化,并将其插入到另一个节点中。

$xml->config->Exported->values = new SimpleXMLElement…

它只插入空间。因此,仅使用SimpleXML的解决方案是扫描XML并创建一个新的XML。

在我看来,重新组织XML最有力的方法是XSLT。