在新的顶级节点SimpleXML中添加先前的顶级节点

时间:2014-04-21 19:04:41

标签: php 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 http://www.php.net/manual/en/simplexmlelement.addattribute.php

的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个新节点?

2 个答案:

答案 0 :(得分:1)

似乎SimpleXML不允许这样的操作。 它可以通过简单的文本轻松替换节点内容;

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

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

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

产生«&amp; lt; a&amp; gt; asd&amp; lt; / a&amp; gt;»。 我还尝试调用SimpleXMLElement的conctructor来创建节点内容并将其插入另一个节点。

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

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

在我看来,重组XML的最强大的方法是XSLT。

答案 1 :(得分:1)

这不适用于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>