给定一个基础$xml
和一个包含<something>
标记的文件,其中包含子项的子属和子项,我想将其作为第一个子项及其所有子项作为原始XML追加。
原始XML:
<root>
<people>
<person>
<name>John Doe</name>
<age>47</age>
</person>
<person>
<name>James Johnson</name>
<age>13</age>
</person>
</people>
</root>
文件中的XML:
<something someval="x" otherthing="y">
<child attr="val" ..> { some children and values ... }</child>
<child attr="val2" ..> { some children and values ... }</child>
...
</something>
结果XML:
<root>
<something someval="x" otherthing="y">
<child attr="val" ..> { some children and values ... }</child>
<child attr="val2" ..> { some children and values ... }</child>
...
</something>
<people>
<person>
<name>John Doe</name>
<age>47</age>
</person>
<person>
<name>James Johnson</name>
<age>13</age>
</person>
</people>
</root>
此标记包含直接和递归的多个子项,因此通过SimpleXML操作构建XML是不切实际的。此外,将其保存在文件中会降低维护成本。
从技术上讲,它只是预先一个孩子。问题是这个孩子会有其他孩子等等。
在PHP addChild page上有评论说:
$x = new SimpleXMLElement('<root name="toplevel"></root>');
$f1 = new SimpleXMLElement('<child pos="1">alpha</child>');
$x->{$f1->getName()} = $f1; // adds $f1 to $x
但是,这似乎并不将我的XML视为原始XML,因此导致<
和>
转义标记出现。关于命名空间的几个警告似乎也出现了。
我想我可以快速更换这些标签,但我不确定它是否会引起未来的问题而且肯定感觉不对。
手动攻击XML不是一种选择,也不是逐个添加子项。选择一个不同的库可能是。
有关如何使其正常工作的任何线索?
谢谢!
答案 0 :(得分:0)
我真的不确定这是否有效。尝试这个或者投下这个,但我希望它有所帮助。使用DOMDocument
(Reference)
<?php
$xml = new DOMDocument();
$xml->loadHTML($yourOriginalXML);
$newNode = DOMDocument::createElement($someXMLtoPrepend);
$nodeRoot = $xml->getElementsByTagName('root')->item(0);
$nodeOriginal = $xml->getElementsByTagName('people')->item(0);
$nodeRoot->insertBefore($newNode,$nodeOriginal);
$finalXmlAsString = $xml->saveXML();
?>
有时UTF-8会出现问题,然后试试这个:
<?php
$xml = new DOMDocument();
$xml->loadHTML(mb_convert_encoding($yourOriginalXML, 'HTML-ENTITIES', 'UTF-8'));
$newNode = DOMDocument::createElement(mb_convert_encoding($someXMLtoPrepend, 'HTML-ENTITIES', 'UTF-8'));
$nodeRoot = $xml->getElementsByTagName('root')->item(0);
$nodeOriginal = $xml->getElementsByTagName('people')->item(0);
$nodeRoot->insertBefore($newNode,$nodeOriginal);
$finalXmlAsString = $xml->saveXML();
?>