【发布时间】:2015-10-17 21:03:54
【问题描述】:
我正在尝试使用 Perl 中的 XML::LibXML 将子元素添加到 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>
我怎样才能做到这一点?
【问题讨论】:
-
您没有将文本元素添加到您正在添加的 $new_tag 中,并且您没有删除用于 para1 信息的文本元素。所以
仍然有文本,而 没有。