使用SimpleXML添加子节点

时间:2010-08-05 09:19:34

标签: php simplexml

我有一个XML文档,想要使用SimpleXML在特定位置插入一个新节点。

原始XML是:

<epp 
  xmlns="urn:ietf:params:xml:ns:epp-1.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd"
>
  <command>
    <create>
      <domain:create 
        xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"
        xsi:schemaLocation="urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd"
      >
        <domain:period unit="y"></domain:period>
      </domain:create>
    </create>
  </command>
</epp>

<domain:create>之后我需要添加以下节点:

<domain:ns>
  <domain:hostAttr>
    <domain:hostName></domain:hostName>
    <domain:hostAddr ip="v4"></domain:hostAddr>
  </domain:hostAttr>
</domain:ns>

我该怎么做?我试过这个:

$xmlObj = simplexml_load_file('myXMLFile.xml');
$nsNode = $xmlObj->command->create->children(self::OBJ_URI_DOMAIN)->create->addChild('domain:ns');
$hostAttr = $nsNode->addChild('domain:hostAttr');
$hostName = $hostAttr->addChild('domain:hostName');
$hostAddr = $hostAttr->addChild('domain:hostAddr');
$hostAddr->addAtribute('ip', 'v4');

在第一行,我收到了这个警告:

  

警告:SimpleXMLElement :: addChild()   [simplexmlelement.addchild]:不能   加孩子。父母不是永久性的   XML树的成员

在第二行,正因为如此,我得到了:

  

致命错误:调用成员函数   addChild()在非对象

提前致谢。

附加说明: - php版本高于5.1; - 我之后在同一个XML上成功添加了子节点。

2 个答案:

答案 0 :(得分:1)

您希望将孩子添加到<create>

$nsNode = $xmlObj->command->create->addChild('domain:ns');

children()方法返回已过滤的子节点列表。此列表 - 正如错误消息所示 - 不是文档树的永久成员,它无法添加到。

添加子项仅适用于相应的父元素,或者该操作不会被称为“addChild”,而是“addSibling” - 这不是DOM的概念的工作原理。 / p>

PS:您的第二条错误消息(“调用非对象上的成员函数”)是常规邋iness的结果。你不能只使用一个对象而不检查它实际上是那里,你的代码缺少这个检查:

if ($nsNode !== null) {
  $hostAttr = $nsNode->addChild('domain:hostAttr');
  $hostName = $hostAttr->addChild('domain:hostName');
  $hostAddr = $hostAttr->addChild('domain:hostAddr');
  $hostAddr->addAttribute('ip', 'v4');
} else {
  echo "Oops, addChild() failed!";
}

答案 1 :(得分:1)

我无法重现第一个错误

<?php
echo phpversion(), "\n";
// $xmlObj = simplexml_load_file('myXMLFile.xml');
$xmlObj = getDoc();

$nsNode = $xmlObj->command->create->children('urn:ietf:params:xml:ns:domain-1.0')->create->addChild('domain:ns');
$nsNode->addChild('foo', 'Mary had a little lamb...');
echo $xmlObj->asxml();

function getDoc() {
  return new SimpleXMLElement('<epp 
    xmlns="urn:ietf:params:xml:ns:epp-1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd"
  >
    <command>
      <create>
        <domain:create 
          xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"
          xsi:schemaLocation="urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd"
        >
          <domain:period unit="y"></domain:period>
        </domain:create>
      </create>
    </command>
  </epp>');
}

打印

5.3.2
<?xml version="1.0"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd">
    <command>
      <create>
        <domain:create xmlns:domain="urn:ietf:params:xml:ns:domain-1.0" xsi:schemaLocation="urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd">
          <domain:period unit="y"/>
        <domain:ns><domain:foo>Mary had a little lamb...</domain:foo></domain:ns></domain:create>
      </create>
    </command>
  </epp>