Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用SimpleXML添加子节点_Php_Simplexml - Fatal编程技术网

Php 使用SimpleXML添加子节点

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> <

我有一个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>
在这第一行,我得到一个警告:

警告: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>