我出于某些工作原因使用旧版本的Perl,v5.6.1
我做了以下事情:
#!usr/bin/env perl
use warnings;
use strict;
use Data::Dumper;
use XML::Simple;
my $xml = new XML::Simple; # create object
my $inputxml = $xml->XMLin("C:\\original.xml");
print "\nInput XML File read... OK\n\n";
my $path = "C:\\output.xml";
open my $fh, ">", $path or die "$0: open $path: $!";
print $fh XMLout($inputxml);
close $fh or warn "$0: close $path: $!";
我必须在上面的方法中写入文件,因为下面的方法不起作用:
#my $outputfile = $xml->XMLout($inputxml, OutputFile => 'output.xml');
如果仔细观察,output.xml根本不符合original.xml。新编写的output.xml文件如下所示:
</InstanceOverride>
<InstanceOverride name="NetworkInterfaces">
<CELL mlinkType="0" ethInterfaceName="#0" name="RtfCsm" />
</InstanceOverride>
而不是看起来像:
<InstanceOverride>
<NetworkInterfaces>
<CELL>
<RtfCsm
mlinkType="0"
ethInterfaceName="#0"/>
</CELL>
</NetworkInterfaces>
</InstanceOverride>
但它们都是xml。如何修复此输出格式?我不能使用这种新的wierd格式,我需要原始的XML格式。什么是SAX格式?
我需要帮助!
这是另一个用于测试foo.xml的输入XML文件:
<?xml version="1.0" encoding="UTF-8"?><Deploy xmlns="http://www.dnsleak.com/view"> <SystemWideOverride>
<Bearers>
<ENB>
<DrbProfile
instanceNumber="7">
<PdcpProfile
DlDataForwarding="false"
UlDataForwarding="false"/>
</DrbProfile>
</ENB>
</Bearers>
</SystemWideOverride>
</Deploy>
答案 0 :(得分:2)
XML::Simple
将其XML存储为哈希哈希值。当您输出这些哈希值时,很可能会得到完全不同的输出。毕竟,哈希没有设置顺序,因此您的XML实体订单很可能会有所不同。此外,在一系列哈希中可以通过多种方式实现特定的XML语法 - 这就是您所遇到的。
您可以尝试使用各种参数和方法来调整XML::Simple
以执行您想要的操作。但是,此警告嵌入XML::Simple
文档中的原因是:
不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口。特别强烈建议使用XML :: LibXML。
此模块的主要问题是大量选项以及这些选项交互的任意方式 - 通常会产生意外结果。
我仍然使用XML::Simple
作为一种快速而又脏的方法来解析XML文件以进行分析 - 例如,解析Ant build.xml
文件以找出正在构建jar文件的目标。但是,我不会依赖它来保持我的XML结构准确。