Учитывая базовый $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>
Этот тег будет содержать несколько дочерних элементов как прямые, так и рекурсивно, поэтому было бы нецелесообразно создавать XML с помощью операций SimpleXML. Кроме того, сохранение его в файле приведет к снижению затрат на обслуживание.
Технически это просто добавит одного ребенка. Проблема в том, что у этого ребенка будут другие дети и так далее.
На странице PHP addChild есть комментарий, который гласит:
$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 не является вариантом, и ни один из них не добавляет детей. Выбор другой библиотеки может быть.
Любые подсказки о том, как заставить это работать?
Благодарю!
Я действительно не уверен, что это сработает. Попробуйте это или снимите это, но я надеюсь, что это поможет. Использование 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();
?>
$newNode = $xml->createElement($someXMLtoPrepend);
но я получаю PHP Fatal error: Uncaught exception 'DOMException' with message 'Invalid Character Error'
и несколько предупреждений, связанных с пространствами имен. XML действителен и не генерируется вручную.