PHP simpleXML:加载字符串作为节点返回空白? (simplexml_load_string)

时间:2010-08-05 14:57:34

标签: php xml string simplexml

我正在尝试通过将字符串加载为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但没有内容,尽管它确实放入了换行符。

虽然当我在simplexml_load_string($ nodestring)上执行var_export时,我得到:

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

所以我不确定我做错了什么......

编辑:

示例xml-file:

<config>
    <sections>
        <fields>
            text
        </fields>
    </sections> 
</config>
尝试添加子节点后,

Sampe $ xml -file:

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


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

2 个答案:

答案 0 :(得分:1)

SimpleXML无法操纵节点。您可以从值创建新节点,但无法创建节点,然后将此节点复制到另一个文档。

以下是该问题的三种解决方案:

  1. 请改用DOM
  2. 直接在右侧文档中创建节点,例如

    $option = $fields->addChild('option');
    $option->addChild('label', 'A label');
    $option->addChild('value', 'A value');
    
  3. 使用SimpleDOM等库,可以在SimpleXML元素上使用DOM方法。

  4. 在您的示例中,解决方案2似乎是最好的。

答案 1 :(得分:0)

我使用的代码:

// 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);