如何使用Perl和XML :: Twig修改XML文件

时间:2014-04-19 21:13:17

标签: perl xml-twig

我尝试使用此程序修改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.

2 个答案:

答案 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>