Php 使用SimpleXML添加子节点
我有一个XML文档,希望使用SimpleXML在特定位置插入一个新节点 原始XML如下所示:Php 使用SimpleXML添加子节点,php,simplexml,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> <
<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>
在这第一行,我得到一个警告:
警告:SimpleXMLElement::addChild()
[simplexmlelement.addchild]:无法
添加子项。父母不是永久的
XML树的成员
在第二行,正因为如此,我得到:
致命错误:调用成员函数
非对象上的addChild()
提前谢谢
补充说明:
-php版本高于5.1;
-我后来成功地在同一个XML上添加了子节点。您希望将子节点添加到
$nsNode = $xmlObj->command->create->addChild('domain:ns');
children()
方法返回子节点的筛选列表。正如错误消息所示,此列表不是文档树的永久成员,无法添加到
添加一个子元素只能在相应的父元素上工作,否则该操作将不会被称为“addChild”,而是“addSibling”——DOM的概念不是这样工作的
PS:您的第二条错误消息(“对非对象调用成员函数”)是规则的草率造成的。您不能只使用对象而不检查它是否确实存在,您的代码缺少此检查:
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!";
}
我无法重现第一个错误
<?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>');
}
command->create->child('urn:ietf:params:xml:ns:domain-1.0')->create->addChild('domain:ns');
$nsNode->addChild('foo','Mary有一只小羊羔…');
echo$xmlObj->asxml();
函数getDoc(){
返回新的SimpleXMLElement('
');
}
印刷品
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>
5.3.2
玛丽有一只小羊羔。。。
看起来像是我绝望的复制品:(抱歉。我认为它们是无关的。:s如果你认为它更合适,你可以删除。没关系。我只是在谷歌搜索错误消息时发现了那篇帖子。让我们看看那里的人发布解决方案需要多长时间。:)我明白了。因此,这里的错误是由于我假设“命令->扩展->子项(self::EXT\u URI\u DOMAIN)->创建->添加子项('ptdomain:autoRenew');而且它是有效的:您不能向children()
的返回值添加句点。如果需要添加到此方法返回的其中一个节点,请保存该方法的返回值,从中选择一个特定节点,然后在此节点上调用addChild()
。对不起,我的错误。我已经更改了帖子,$nsNode=$xmlObj->command->create->children(self::OBJ_URI_DOMAIN)->create->addChild('DOMAIN:ns');这是我的本意。在这里,我们不是直接访问列表,而是该列表的一个节点。这就是我的其他命令工作的原因。如果您的最后一个回复在评论之后仍然适用,请让我知道。:)在这一行,这个新的配置中,错误发生了,但同样的,在其他行中,它没有相同的形式,这就是我困惑的原因。我会忘记其他说明是有效的,我会按照建议尝试。将子列表传递给变量,访问子列表子列表,仅在那里使用addChild()方法:sTried:$listChildren=$xmlObj->command->create->children(self::OBJ_URI_DOMAIN)$nodeCreate=$listChildren->create$nodeCreate->addChild('domains:ns');不走运。99%都是我的错。。。我只是想知道我没有得到什么(非常感谢您的时间,VolkerK。好吧……唯一的区别是我正在抓取一个XML文件。为了维护整体结构,我需要保持这一点。我将一步一步地重新制作所有内容,并在今天晚些时候提供一些反馈-我希望没有人通过我现在正在传递的内容-:不确定您是否仍然与我在一起,我发现:好。…我找到了开关,但我没有看到任何其他东西…仍然:这是有效的:$nsNode=$xmlObj->command->create->children($urn:ietf:params:xml:ns:domain-1.0')->create->addChild($domain:ns');这没有,并向我发出警告:$nsNode=$xmlObj->command->create->children self::OBJ_URI_domain->create->addChild('domain:ns'));我的课堂上有这样一个问题:const OBJ_URI_DOMAIN='urn:ietf:params:xml:ns:epp:DOMAIN-1.0'什么会导致这种行为?URI是不同的。:s Done.:)非常感谢。
<?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>