PHP simpleXML: загрузка строки, когда узел возвращает пустое значение?(Simplexml_load_string) - PullRequest
0 голосов
/ 05 августа 2010

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

// Load xml
$path = 'path/to/file.xml';
$xml = simplexml_load_file($path);

// Select node
$fields = $xml->sections->fields;

// Create new child node
$nodestring = '<option>
           <label>A label</label>
           <value>A value</value>
           </option>';

// Add field
$fields->addChild('child_one', simplexml_load_string($nodestring));

По какой-то причине child_one добавляется, но без содержимого, хотя он вставляет разрывы строк.

Хотя, когда я делаю var_export для simplexml_load_string ($ nodestring), я получаю:

    SimpleXMLElement::__set_state(array(
   'label' => 'A label',
   'value' => 'A value',
    ))

Так что я не уверен, что делаю не так ...

EDIT:

Пример xml-файла:

<config>
    <sections>
        <fields>
            text
        </fields>
    </sections> 
</config>

Файл Sampe $ xml после попытки добавить дочерний узел:

<config>
    <sections>
        <fields>
            text
        <child_one>


</child_one></fields>
    </sections> 
</config>

Ответы [ 2 ]

1 голос
/ 05 августа 2010

SimpleXML не может манипулировать узлами. Вы можете создавать новые узлы из значений, но не можете создать узел, а затем скопировать этот узел в другой документ.

Вот три решения этой проблемы:

  1. Вместо этого используйте DOM .
  2. Создайте узлы в нужном документе напрямую, например,

    $option = $fields->addChild('option');
    $option->addChild('label', 'A label');
    $option->addChild('value', 'A value');
    
  3. Используйте библиотеку, такую ​​как SimpleDOM , которая позволит вам использовать методы DOM для элементов SimpleXML.

В вашем примере решение 2 кажется лучшим.

0 голосов
/ 05 августа 2010

Код, который я использовал:

// Load document
$orgdoc = new DOMDocument;
$orgdoc->loadXML("<root><element><child>text in child</child></element></root>");

// Load string
$nodestring = '<option>
       <label>A label</label>
       <value>A value</value>
       </option>';

$string = new DOMDocument;
$string->loadXML($nodestring);

// Select the element to copy
$node = $string->getElementsByTagName("option")->item(0);

// Copy XML data to other document
$node = $orgdoc->importNode($node, true);
$orgdoc->documentElement->appendChild($node);
...