我有一个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上成功添加了子节点。
答案 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>