2014-04-19 50 views
0

一個XML文件,我試圖修改一個XML文件name場當我執行的Perl使用該程序如何修改使用Perl和XML ::嫩枝

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" /> 

腳本它打印錯誤

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

我試圖整理您的文章一點,但我不明白的緊隨Perl代碼的XML片段。有兩個沒有根元素的空'div'元素,所以它不是格式良好的XML。請你展示一些更接近實際問題的東西? – Borodin

+0

當然,在每個Perl程序開始時,您總是必須*總是使用strict和'use warnings',特別是當您要求代碼的幫助時 – Borodin

回答

1

我試圖整理你的文章一點,但我不瞭解緊隨Perl代碼的XML片段。

有兩個空的div沒有根元素的元素,因此它不是格式良好的XML。

XML::Twig被假設第一div元件是文檔(根)元素和,因爲它沒有任何內容,隨後的文本產生錯誤信息

junk after document element 

也已設置twig_handlers到只是一個單一的元素處理XML中的association元素,但是您的數據沒有這樣的元素。

我認爲你需要解釋一下它是什麼,你需要做的

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> 

,它也不清楚你想與你的 「XML」 做什麼。我懷疑你試圖將div標籤的名稱屬性改爲'xxx'。如果是這樣的話,那麼你需要你的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>