使用XML添加新节点:libXML抛出错误

时间:2015-08-07 20:13:54

标签: xml perl xml-libxml

这是xml的样子

<RasdItemsList xmlns="http://www.vmware.com/vcloud/v1.5" xmlns:rasd="...">
      <Link rel="edit" type="application/vnd.vmware.vcloud.rasdItemsList+xml" href="..."/>
      <Item>
          <rasd:AddressOnParent>0</rasd:AddressOnParent>
          <rasd:Description>Hard disk</rasd:Description>
          <rasd:ElementName>Hard disk 1</rasd:ElementName>
          <rasd:HostResource xmlns:ns12="http://www.vmware.com/vcloud/v1.5" ns12:capacity="59392" ns12:busSubType="lsilogic" ns12:busType="6"></rasd:HostResource>
          <rasd:InstanceID>2000</rasd:InstanceID>
          <rasd:Parent>2</rasd:Parent>
          <rasd:ResourceType>17</rasd:ResourceType>
      </Item>
      <Item>
          <rasd:AddressOnParent>1</rasd:AddressOnParent>
          <rasd:Description>Hard disk</rasd:Description>
          <rasd:ElementName>Hard disk 2</rasd:ElementName>
          <rasd:HostResource xmlns:ns12="http://www.vmware.com/vcloud/v1.5" ns12:capacity="4" ns12:busSubType="lsilogic" ns12:busType="6"></rasd:HostResource>
          <rasd:InstanceID>2001</rasd:InstanceID>
          <rasd:Parent>2</rasd:Parent>
          <rasd:ResourceType>17</rasd:ResourceType>
      </Item>
.. Some more items
</RasdItemsList>

我正在尝试为此添加一个新的Item节点,即使用XML :: libXML的新硬盘。这是我的代码

  my $doc    = $parser->parse_string ($data_xml); 
  my $xpc = XML::LibXML::XPathContext->new($doc);
  $xpc->registerNs('x', 'http://www.vmware.com/vcloud/v1.5');
  $xpc->registerNs('rasd', 'http:...');
  $xpc->registerNs('ns2','http://www.vmware.com/vcloud/v1.5');

  # add a new node
  my $new_item = $doc->createElement("Item");
  my $new_address_on_parent = $doc-> createElement("rasd:AddressOnParent");
  my $new_element_name = $doc->createElement("rasd:ElementName"); 
  my $new_description = $doc->createElement("rasd:Description");
  my $new_InstanceID  = $doc->createElement("rasd:InstanceID");
  my $new_parent = $doc->createElement("rasd:Parent");
  my $new_resource_type = $doc->createElement("rasd:ResourceType");
  my $new_host_resource = $doc->createElement("rasd:HostResource");
  if( my ($node) =  $xpc->findnodes('/x:RasdItemsList/x:Item') )
  {
    my $new_parent =  $node->parentNode;
    $new_parent->appendChild($new_item);
    $new_item->appendChild($new_address_on_parent);
    $new_item->appendChild($new_description);
    $new_item->appendChild($new_element_name);
    $new_item->appendChild($new_host_resource);
    $new_item->appendChild($new_InstanceID);
    $new_item->appendChild($new_parent);
    $new_item->appendChild($new_resource_type);
    $new_address_on_parent->appendText('4');
    $new_description->appendText('Hard disk');
    $new_element_name->appendText('Hard Disk 4');
    $new_host_resource->appendText("What to add");
    $new_InstanceID->appendText('2004');
    $new_parent->appendText('2');
    $new_resource_type->appendText('17');

这是抛出错误“appendChild:HIERARCHY_REQUEST_ERR”。我试图逐个添加子项,直到我添加Elementname。在那之后,无论我尝试添加什么,我都会得到上述错误。

另外我不确定如何添加rasd:HostResource子文本。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

查看error message description

HIERARCHY_REQUEST_ERR是

&#34;如果此节点属于不允许newChild节点类型的子节点的类型,或者要插入的节点是此节点的祖先之一,则引发该节点&#34;

您正在向找到的节点的父级添加$ new_item($ doc的子级)。我猜测 $ new_item是该节点的祖先。

您正在寻找&#34;项目&#34;适合的节点:将子项添加到$ doc(此处:$ new_item)将是Item之上的级别,至少低于层次结构中的RasdItemsList。

希望它有所帮助!

答案 1 :(得分:0)

$ new_parent是罪魁祸首。它已经用作项目节点的父节点,因此不能再次用作项目的子节点。以下行是创建问题。 $ new_item-&GT;使用appendChild($ new_parent);

我修复了这两行并且它有效。

 my $new_parent =  $node->parentNode;
 $new_parent->appendChild($new_item);

to 
my $new_parent_node = $node->parentNode;
$new_parent_node->appendChild($new_item);