2015-01-05 3 views
0

Учитывая базу $xml и файл, содержащий тег <something> с атрибутами, дочерними элементами и дочерними элементами его дочерних элементов, я хотел бы добавить его как первый ребенок и все его дочерние элементы в качестве необработанного XML.Предоставление необработанного XML с использованием PHP SimpleXML

Оригинальный 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 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 не является вариантом, и ни один из них не добавляет детей. Выбор другой библиотеки может быть.

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

Спасибо!

+0

возможно дубликат [SimpleXML, как предварять ребенка в узле?] (HTTP: // stackoverflow.com/questions/2092012/simplexml-how-to-prepend-a-child-in-a-node) – Forien

+0

Моя основная проблема заключается в добавлении необработанного 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(); 
?> 
+0

Я отредактировал вашу третью строку следующим образом: '$ newNode = $ xml-> createElement ($ someXMLtoPrepend);' но я получаю 'PHP Fatal error: исключить исключение 'DOMException' с сообщением 'Invalid Character Error' 'и несколько предупреждений, связанных с Пространства имен. XML действителен, а не создается вручную. –

+0

Вы уверены, что это не случай: http: // stackoverflow.com/questions/8524111/php-invalid-character-error? Я имею в виду - ни одно из ваших имен узлов не начинается с номера или чего-то еще? – Forien

+0

У меня нет никаких тегов с цифрой в начале их имен. Я все равно посмотрю на это. –

Смежные вопросы