我尝试使用此程序修改XML文件中的name
字段
use XML::Twig;
open(OUT, ">resutl.xml") or die "cannot open out file main_file:$!";
my $twig = XML::Twig->new(
pretty_print => 'indented',
twig_handlers => {
association => sub {
$_->findnodes('div');
$_->set_att(name => 'xxx');
},
},
);
$twig->parsefile('in.xml');
$twig->flush(\*OUT);
<div
name="test1"
booktype="book1"
price="e200"
/>
<div
name="test2"
booktype="book2"
price="100" />
当我执行Perl脚本时,它会输出错误
junk after document element at line 6, column 0, byte 65 at C:/Perl64/lib/XML/Parser.pm line 187.
at C:\Users\admin\Desktop\parse.pl line 14.
答案 0 :(得分:1)
我试图稍微整理一下你的帖子,但我不理解紧跟Perl代码的XML片段。
有两个没有根元素的空div
元素,因此它不是格式良好的XML。
XML::Twig
假设第一个div
元素是文档(根)元素,并且由于它没有内容,后续文本会生成错误消息
junk after document element
您还将twig_handlers
设置为仅处理XML中association
元素的单个元素,但您的数据没有此类元素。
我认为你需要解释更多关于你需要做什么的事情
答案 1 :(得分:1)
格式正确的xml需要单个根元素。当XML::Twig
尝试解析您的文件时,它会找到第一个div
并确定该文件的根元素。当它到达结尾并在第6行找到另一个标签时,它会变得不快乐并正确地说它出现了错误。
如果此文档实际上是XML,那么您需要将该数据包含在假元素中,以便它可以解析。以下是:
use strict;
use warnings;
use XML::Twig;
my $data = do {local $/; <DATA>};
# Enclose $data in a fake <root> element
$data = qq{<root>$data</root>};
my $twig = XML::Twig->new(
pretty_print => 'indented',
twig_handlers => {
association => sub {
$_->findnodes('div');
$_->set_att(name => 'xxx');
},
},
);
$twig->parse($data);
$twig->print;
__DATA__
<div
name="test1"
booktype="book1"
price="e200"
/>
<div
name="test2"
booktype="book2"
price="100" />
输出:
<root>
<div booktype="book1" name="test1" price="e200"/>
<div booktype="book2" name="test2" price="100"/>
</root>
现在,它还不清楚你正在尝试用你的&#34; XML&#34;。我怀疑您正在尝试将div标签的名称属性更改为&#39; xxx&#39;。如果是这种情况,那么您需要将twig_handlers
重做为以下内容:
twig_handlers => {
'//div' => sub { $_->set_att(name => 'xxx'); },
},
输出将是:
<root>
<div booktype="book1" name="xxx" price="e200"/>
<div booktype="book2" name="xxx" price="100"/>
</root>