使用XML :: LibXML编写XML时如何创建要追加的节点?

时间:2019-07-18 21:22:19

标签: perl libxml2

类似于下面的示例,我正在创建一个XML文档并向其中添加一个复杂的节点。

以下内容有效,但是在创建$row_template的方式上却有些困惑。没有更具体的方法来创建文档片段以从xml字符串重用吗?

use 5.022;
use warnings;
use XML::LibXML;

my $xml = '<?xml version="1.0"?><RootNode><Outer1><Outer2/></Outer1></RootNode>';
my $row_parent_xpath = '//Outer2';
my $row_xml = '<DetailNode><Field1/><Field2/></DetailNode>';

# create the document
my $doc = XML::LibXML->load_xml('string' => $xml);
# find where we will be inserting nodes
my ($parent) = $doc->findnodes($row_parent_xpath);

# create a template for the nodes to insert
my $row_template = XML::LibXML->load_xml('string' => $row_xml)->documentElement;
$row_template->setOwnerDocument($doc);

for my $row_data ({field1=>'Foo',field2=>'Bar'}, {field1=>'Baz',field2=>'Quux'}) {
    my $row = $row_template->cloneNode(1);
    $parent->appendChild($row);
    $_->appendChild($doc->createTextNode($row_data->{field1})) for $row->findnodes('Field1');
    $_->appendChild($doc->createTextNode($row_data->{field2})) for $row->findnodes('Field2');
}

say $doc->toString(1);

输出:

<?xml version="1.0"?>
<RootNode>
  <Outer1>
    <Outer2>
      <DetailNode>
        <Field1>Foo</Field1>
        <Field2>Bar</Field2>
      </DetailNode>
      <DetailNode>
        <Field1>Baz</Field1>
        <Field2>Quux</Field2>
      </DetailNode>
    </Outer2>
  </Outer1>
</RootNode>

1 个答案:

答案 0 :(得分:2)

libxml2具有xmlParseBalancedChunkMemory,该文件也带有一个文档。 XML :: LibXML具有parse_balanced_chunk,但这不允许设置文档。我不确定您是否必须致电setOwnerDocument。附加克隆的节点时,应自动设置所有者文档。