Предварительное добавление необработанного XML с использованием PHP SimpleXML

0

Учитывая базовый $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 &lt; и &gt; экраны с экранами. Кажется, что появляется несколько предупреждений об пространствах имен.

Полагаю, я мог бы быстро заменить такие теги, но я не уверен, может ли это стать причиной будущих проблем, и это, безусловно, не так.

Ручной взлом XML не является вариантом, и ни один из них не добавляет детей. Выбор другой библиотеки может быть.

Любые подсказки о том, как заставить это работать?

Благодарю!

  • 0
    возможный дубликат SimpleXML, как добавить ребенка в узел?
  • 0
    Моя основная проблема на самом деле заключается в добавлении необработанного XML, а не в порядке добавления кода, хотя было бы очень желательно, чтобы тег был сверху. Упомянутый вопрос не касается такой проблемы. Я только отредактировал название своего вопроса, чтобы отразить такую разницу.
Показать ещё 1 комментарий
Теги:
simplexml

1 ответ

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();
?>
  • 0
    Я отредактировал вашу третью строку так: $newNode = $xml->createElement($someXMLtoPrepend); но я получаю PHP Fatal error: Uncaught exception 'DOMException' with message 'Invalid Character Error' и несколько предупреждений, связанных с пространствами имен. XML действителен и не генерируется вручную.
  • 0
    Вы уверены, что это не так: stackoverflow.com/questions/8524111/php-invalid-character-error ? Я имею в виду - ни один из ваших узлов имя не начинается с числа или что-то?
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню