3

入力 XML

<?xml version="1.0" encoding="utf-8"?>
<!--00/00/0000 12:35:25 AM-->
<Physical xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
  <Pro managementID="22000020">
    <Identification Type="XXXXX" >          
      <Address>
        <Data>test</Data>        
      </Address>
      <Phone>
        <Number>0000</Number>
      </Phone>
      <Email>test@com</Email>
    </Identification>       
  </Pro>
</Physical>

脚本:

タグの値を変更し、残りを新しい出力 xml ファイルに出力しようとしています

use strict;
use warnings;
use XML::Simple;
use Data::Dumper;     

  my $xml = XML::Simple->new(ForceContent => 1,);
  my $xmlData = $xml->XMLin('input.xml') or die$!;     

  print Dumper (\$xmlData);

  foreach my $xmlKey ( keys %{$xmlData} ){
   if ( $xmlKey =~ m/Pro/){
       print ${$xmlData}{$xmlKey}{Identification}{Address}{Data}="hello";
    }
  }

XMLout(
    $xmlData,
    KeepRoot => 1,
    NoAttr => 0,
    OutputFile => $xml_out,
);

出力 XML:

<opt xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Pro managementID="22000020">
     <Identification Type="XXXXX">
      <Address Data="hello" />
      <Email>test@com</Email>
      <Phone name="Number">0000</Phone>
    </Identification>
  </Pro>
</opt>

値を変更することはできますが、データを出力に書き込もうとしているときに、フォーマットが変更されました。値が変更された同じ入力データを出力として取得する方法を教えてください。

4

5 に答える 5

4

XML::LibXML を次のように使用します。

#!/usr/bin/perl
use strict;
use warnings;

use XML::LibXML;

my $input;
while(<>) {
    $input .= $_;
}
my $xml_doc = XML::LibXML->load_xml(string => $input);
my $xpath_ctx = new XML::LibXML::XPathContext($xml_doc);
$xpath_ctx->find("/Physical/Pro/Identification/Address/Data")->get_node(0)->firstChild()->setData("hello");
my $xml_data = $xpath_ctx->find("/")->get_node(0)->toString(1);

print $xml_data;

XML::LibXML ははるかに高速であり、XPath の助けを借りて、の操作$xml_docははるかに簡単です。

ここで見つけることができる詳細情報

于 2012-10-29T09:40:41.640 に答える
2

XML :: Twigバージョン:

#!/usr/bin/perl 

use strict;
use warnings;

use XML::Twig;

XML::Twig->new( twig_roots => { 'Pro/Identification/Address/Data' => sub { $_->set_text( 'hello'); $_->flush; } },
                twig_print_outside_roots => 1,
              )
         ->parsefile( 'input.xml');
于 2012-10-29T11:27:56.797 に答える
2

別の XML 処理モジュールを使用してください。たとえば、次のスクリプトはXML::LibXMLのラッパーであるXML ::XSH2 を使用します。

#!/usr/bin/perl
use warnings;
use strict;

use XML::XSH2;

xsh << 'END';
    open input.xml ;
    for //*[xsh:matches(name(),'Pro')]/Identification/Address/Data
        set . 'hello' ;
    save :b ;
END
于 2012-10-29T09:34:31.633 に答える
1

XML::Rules を使用したさらに別の方法

use strict;
use warnings;

use XML::Rules;

my @rules = (
  Data => sub { $_[1]{_content} =~ s/test/hello/; return $_[0] => $_[1] },
);
my $xr = XML::Rules->new(
  rules => \@rules,
  style => 'filter',
);

$xr->filterfile('input.xml');
于 2012-10-29T17:43:58.130 に答える
0

NoAttr出力用にゼロに設定しました。

それはあなたが望むものとは逆ではありませんか?

属性なし => 1

XMLout() で使用すると、生成された XML には属性が含まれません。すべてのハッシュ キー/値は、代わりにネストされた要素として表されます。

NoAttr は停止します

<Phone>
    <Number>0000</Number>

に変わる

 <Phone name="Number">
于 2012-10-30T00:46:28.913 に答える