В Perl, как я могу изменить элемент в файле XML без изменения формата файла XML?

У меня есть XML-файл формата:


    
        Stonecold
        warrior
        wwf
    
    
        Shanebond
        Bowler
        newzealand
    
    
        brain schemidit
        Chairman
        Google
    

Я хочу изменить значениеShanebond кShane Bond

Я использовалXML::Simple, но результатом был хэш.

Я хочу тот же формат, что и входной файл. Например: выходной файл должен быть следующим:


    
        Stonecold
        warrior
        wwf
    
    
        Shane Bond
        Bowler
        newzealand
    
    
        brain schemidit
        Chairman
        Google
    

Пожалуйста, посоветуйте, как это сделать.

Заранее спасибо.

Я хочу, чтобы выходной файл был сохранен в том же каталоге и, если возможно, с тем же именем. Является ли это возможным?

 innaM25 авг. 2009 г., 13:55
Какие'не так с хешем?
 innaM25 авг. 2009 г., 15:00
XMLin -> содержание процесса -> XMLout
 PJ.25 авг. 2009 г., 14:14
XML-файл является файлом конфигурации, и компонент, который его использует, можетчитать хэш-файл. также, если его формат изменяется после создания файла, компонент также не может прочитать значение из файла конфигурации

Ответы на вопрос(4)

Решение Вопроса

XML::Simple имеет параметры, которые позволяют вам указать, как ввод будет преобразован в структуру данных Perl и как эта структура будет выводиться:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Simple;

my $xml_file = 'b.
my $xml = XMLin(
    $xml_file,
    KeepRoot => 1,
    ForceArray => 1,
);

$xml->{outer1}->[0]->{inner1}->[1]->{name} = 'Shane Bond';

XMLout(
    $xml,
    KeepRoot => 1,
    NoAttr => 1,
    OutputFile => $xml_file,
);

XML::Simple Это немного раздражает, если вы делаете что-то интересное, потому что его цель не в том, чтобы быть библиотекой XML общего назначения, а в том, чтобы предоставить простой способ работы с файлами конфигурации, написанными на XML.

CPAN имеет множествоXML связанные модули, Если это не единственная проблема, с которой вам приходилось сталкиваться, стоило бы рассмотреть некоторые из более способных и более подходящих модулей.

 PJ.25 авг. 2009 г., 14:14
Я хочу, чтобы выходной файл был сохранен в том же каталоге и, если возможно, с тем же именем. Является ли это возможным?
 PJ.26 авг. 2009 г., 13:27
Я попробовал это, и это работает должным образом. Я должен вставить его в основной код, а затем проверить результат. Спасибо за вашу помощь.
 Sinan Ünür25 авг. 2009 г., 15:28
@pchakraborty Конечно, это возможно. Nifle даже показала, как это сделать. Документы объясняютOutputFile ясно. Читайте их время от времени: они помогают.

XML :: Twig часто первый инструмент, который я смотрю, чтобы использовать.

Сначала я подумал, что это может быть излишним для вашего требования, но потом я заметил, что он идет с опцией parsefile_inplace ():

use strict;
use warnings;
use XML::Twig;

XML::Twig->new(
    pretty_print  => 'indented',
    twig_handlers => { 
        name => sub { 
            $_->set_text( 'Shane Bond' )->flush  if $_->text eq 'Shanebond' 
        },
    },
)->parsefile_inplace( 'data.xml', 'bak_*' );

NB. Если вы нене хочу сохранять файл резервной копии, затем удалите второй аргумент ('bak_ *).

XMLout с помощью OutputFile

Из документации по XML :: Simple:

Поведение XMLout () по умолчанию - возвращать XML в виде строки. Если вы хотите записать XML в файл, просто укажите имя файла, используяВыходной файл' вариант.

Эта опция также принимает объект дескриптора ввода-вывода, что особенно полезно в Perl 5.8.0 и более поздних версиях для вывода с использованием кодировки, отличной от UTF-8, например:

open my $fh, '>:encoding(iso-8859-1)', $path or die "open($path): $!";
XMLout($ref, OutputFile => $fh);
 PJ.26 авг. 2009 г., 13:29
Я попробовал это, и это работает должным образом. Я должен вставить его в основной код, а затем проверить результат. Спасибо за вашу помощь.

улярное выражение-заменить?

perl -pi -e 's/Shanebond/Shane Bond/' filename.xml

Это сделает замену на месте, сохраняя то же имя файла и все остальное.

Ваш ответ на вопрос