我试图XML::LibXML
在Perl中使用节点值的开头将子元素添加到XML的节点中。我的XML是:
<root>
<book>
<title>
Test title for xml
</title>
<para n=1> para1 information </para>
<para n=2><head value="PARA HEADING"/>para2 information<subpara i=1>subpara Info</subpara><xyz/></para>
</book>
</root>
我想要的输出是:
<root>
<book>
<title>
Test title for xml
</title>
<para n=1><head value="PARA HEADING"/>para1 information </para>
<para n=2><head value="PARA HEADING"/>para2 information<subpara i=1><head value="PARA HEADING"/>Subpara Info</subpara><xyz/></para>
</book>
</root>
如果上面没有出现在'para'或'subpara'中,我想添加一个子节点'head'。
我已经试过这段代码:
#!/usr/local/bin/perl5.8.8
use XML::LibXML;
my $xml_parser = XML::LibXML->new();
my $xml_doc = $xml_parser->parse_file( xml_file . xml );
my $root = $xml_doc->getDocumentElement();
my $xml_xc = XML::LibXML::XPathContext->new( $root );
my @array_list = ( para, deck );
foreach my $xml_sections ( $xml_xc->findnodes( '//*' ) ) {
if ( $xml_sections->nodeName ne "head" ) {
my $marker_flag = 0;
foreach my $first_child ( $xml_sections->childNodes() ) {
if ( $first_child->nodeName eq "head" ) {
$marker_flag = 1;
last;
}
}
if ( !$marker_flag ) {
foreach my $array_elt ( @array_list ) {
if ( $array_elt eq $xml_sections->nodeName ) {
my $new_tag = $xml_doc->createElement( "head" );
my $value = "PARA HEADING";
my $att1 = $xml_doc->createAttribute( "value", "$value" );
$new_tag->setAttributeNode( $att1 );
$xml_sections->addChild( $new_tag );
}
}
}
}
}
print $root->toString();
exit 0;
我的输出是:
<root>
<book>
<title>
Test title for xml
</title>
<para n=1>para1 information <head value="PARA HEADING"/></para>
<para n=2><head value="PARA HEADING"/>para2 information<subpara i=1>subpara Info<head value="PARA HEADING"/></subpara><xyz/></para>
</book>
</root>
我怎样才能做到这一点?
您让自己变得非常困难!例如,XML::LibXML::XPathContext
除非您的XML数据具有非默认名称空间(示例中没有),否则无需参与。另外,para
和等subpara
元素的属性值n=1
应在其周围n="1"
加上引号,给予等
这是一个使用XPath表达式查找全部para
或subpara
元素,并用于exists
检查每个元素是否已经有head
孩子的解决方案。标量$head
是使用您要插入的数据设置的,标称的副本将插入到找到的每个元素的第一个子元素之前
use strict;
use warnings;
use XML::LibXML;
my $parser = XML::LibXML->new;
my $doc = $parser->parse_fh(*DATA);
my $head = $parser->parse_balanced_chunk('<head value="PARA HEADING"/>');
for my $para ( $doc->findnodes('//para | //subpara') ) {
if ( not $para->exists('head') ) {
$para->insertBefore($head->cloneNode(1), $para->firstChild);
}
}
print $doc;
__DATA__
<root>
<book>
<title>
Test title for xml
</title>
<para n="1"> para1 information </para>
<para n="2"><head value="PARA HEADING"/>para2 information<subpara i="1">subpara Info</subpara><xyz/></para>
</book>
</root>
<?xml version="1.0"?>
<root>
<book>
<title>
Test title for xml
</title>
<para n="1"><head value="PARA HEADING"/> para1 information </para>
<para n="2"><head value="PARA HEADING"/>para2 information<subpara i="1"><head value="PARA HEADING"/>subpara Info</subpara><xyz/></para>
</book>
</root>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句