使用PHP的SimpleXML预先添加原始XML

时间:2015-01-05 13:02:22

标签: php xml simplexml

给定一个基础$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,因此导致&lt;&gt;转义标记出现。关于命名空间的几个警告似乎也出现了。

我想我可以快速更换这些标签,但我不确定它是否会引起未来的问题而且肯定感觉不对。

手动攻击XML不是一种选择,也不是逐个添加子项。选择一个不同的库可能是。

有关如何使其正常工作的任何线索?

谢谢!

1 个答案:

答案 0 :(得分:0)

真的不确定这是否有效。尝试这个或者投下这个,但我希望它有所帮助。使用DOMDocumentReference

<?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();
?>