2014-04-19 4 views
0

Я попытался изменить name поле в файле XML с помощью этой программыКак изменить файл XML с помощью Perl и XML :: Twig

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

Я попытался привести в порядок свой пост немного, но я не понимаю, XML-фрагмент, который сразу же следует за кодом Perl. Есть два пустых элемента 'div' без корневого элемента, поэтому он не является корректным XML. Не могли бы вы показать что-то ближе к реальной проблеме? – Borodin

+0

Разумеется, вы всегда должны * использовать '' strict '' и 'использовать предупреждения' в начале каждой программы Perl, особенно если вы просите о помощи с кодом – Borodin

ответ

1

Я попытался немного приукрасить ваш пост, но я не уверен nderstand XML-фрагмент, который сразу же следует за кодом Perl.

Есть два пустых элемента div без корневого элемента, так как он стоит, это не правильно сформированный XML.

XML::Twig в предположении, что первый div элемент является элементом документа (корень) и, так как он не имеет никакого содержания, последующий текст выдает сообщение об ошибке,

junk after document element 

Вы также установили twig_handlers к только один элемент, который обрабатывает association элементов в XML, но ваши данные не имеют таких элементов.

Я думаю, что вам нужно, чтобы объяснить больше о том, что это то, что вам нужно сделать

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> 
Смежные вопросы