0

背景:

perl 脚本需要在各种服务器(所有 AIX unix)上运行。perl 脚本需要来自 xml 脚本的数据。只需读取数据,无需写入或其他修改操作。xml 脚本的内容有时会发生变化。

问题:

我不能在perl脚本中使用xml解析器模块(比如XML::LibXML),因为aix服务器没有安装模块,我也不想一一安装。aix 服务器有很多。

有一个安装 xml 模块的 linux 服务器(red hat linux)。并且每个 aix 服务器都可以访问它。

有什么方法可以将 xml 数据传递给 perl 脚本,同时不需要 xml 模块?就像首先在linux上解析xml,然后将输出作为输入传递给perl脚本?不知道行不行。

4

3 回答 3

1

如果您有可用的 XML 数据的 .xsd 架构(拥有架构总是一个好主意),那么您可以使用XML::Compile将 XML 数据转换为 perl 数据结构。XML::Compile还附带了一个方便的脚本xml2yaml来创建 YAML 表示。

另一个将 XML 数据转换为 perl 数据结构的流行模块是XML::Simple. 不幸的是,由于XML::Simple没有可用的模式,它经常不得不猜测如何创建数据结构(即,如果它即将创建标量值或数组值),从而导致意外。的文档XML::Simple明确表示不鼓励使用此模块。

一旦你有了数据结构,你只需要决定序列化格式(YAML、JSON、Storable、Data::Dumper...)并将数据传输到其他系统。

于 2013-10-31T08:11:12.443 回答
1

如果 XML 不复杂,您可以编写一个简单的脚本将其转换为其他格式。例如简单的哈希,使用 Data::Dumper 将其转储到文件中,然后在 AIX 上评估输出。

如果它很复杂,您需要自己在内存中表示 XML,(注意属性、子元素、文本节点、名称空间......您的输入有多复杂?)并转储/评估。

评估示例代码:(未经测试)

# read the data to variable
open my $fh, "<", "dumpfile.txt" or die "file not found";
my $dump = do { local $/ = <$fh> };
close $fh;
# eval the dump
my $VAR1;
eval $dump;
于 2013-10-31T07:53:19.273 回答
0

创建一个合理地面向未来的内存表示将是很多工作和很多令人沮丧的调试会话,@Slaven 的答案是一个更好的解决方案。

只是给您另一个选择,您还可以:在任何地方下载一个无依赖的 CPAN 模块,例如https://metacpan.org/pod/XML::TinyXMLhttps://metacpan.org/pod/XML::Tiny,并在您在那里复制自己的脚本时将其复制到 AIX 机器上。例如,您可以将 XML/TinyXML.pm 文件与您的脚本一起放在一个文件夹中,并使用FindBin从您的脚本中使用它,然后将该文件夹作为一个整体复制到 AIX 机器上。

于 2013-10-31T08:18:51.133 回答