xml - 输入 XML 数据与输出 XML 格式不匹配

标签 xml perl

输入 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>

我可以更改值,但当我尝试将数据写入输出时,格式已更改。任何人都可以指导我获得与输出相同的输入数据,但值已更改。

最佳答案

以这种方式使用 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 的操作更容易。

您可以找到更多信息 here

关于xml - 输入 XML 数据与输出 XML 格式不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13118744/

相关文章:

windows - SQLite 如何在 MSWindows 上保存换行符?

linux - 为什么 perl 编译后的代码需要更多的内存?

perl - 如何在 Dist::Zilla dist.ini 中为我的发行版指定最低 perl 版本?

java - 在 Android 的 EditText 中编辑文本时仅显示英文字符

java - 在 java 类中使用 string.xml 资源更改 textView

xml - 如何在 ruby​​ 中进行 XMLRPC::Client 的有线转储?

c# - 将 XML 转换为对象

perl - 为什么在使用 say 函数时要指定 use 语句?

perl - 标量上的实验键现在被禁止警告

c# - Web API - 动态到 XML 序列化