我有一个像这样的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个新节点?
答案 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>