2

我基本上是一名 java 开发人员,但我的客户在 perl 中给了我一个小任务。任务是我将获得 xml 输入,因为我需要搜索一个元素并打印它的值(将值保存在字符串变量中)。例如,在下面的 xml 中,我想读取 FileName 标记的值。

<ConnectHome SchemaVersion="1.0.8">
  <TransType>0090</TransType>
  <Node>
    <ExternalFiles>
      <FileName>some file name</FileName>
    </ExternalFiles>
  </Node>
</ConnectHome>

我正在使用 XML:Simple 库来解析 XML。而且我还可以使用下面的代码读取元素的值。

$xmlSimple = new XML::Simple(KeepRoot   => 1);
$dataXML = $xmlSimple->XMLin("RepeatedElement.xml");
my $fileNameValue = $dataXML->{ConnectHome}->{Node}->{ExternalFiles}->{FileName};

但是我的客户想要使用元素名称搜索值,因为路径可能会在 xml 中更改。

"FileName"

而不是硬编码路径。

所以我的问题是如何通过元素名称而不是硬编码路径来获取值?有没有按名称搜索元素的方法?我将在字符串变量中传递元素的名称。

4

1 回答 1

3

如果这是您唯一的任务,您可以切换到另一个库,例如XML::Twig,这样会更容易。

XML::Simple还要考虑's 文档中的这个注释

不鼓励在新代码中使用此模块。其他模块也可以提供更直接和一致的接口。特别是,强烈推荐使用 XML::LibXML。

这个模块的主要问题是大量的选项以及这些选项交互的任意方式——通常会产生意想不到的结果。

欢迎使用带有错误修复和文档修复的补丁,但不太可能添加新功能。

这是一个利用XML::Twig. 为您感兴趣的元素设置处理程序。(在本例中,我将文本内容推送到数组中)。

use XML::Twig;

my @filenames;
my $twig = XML::Twig->new(
  twig_handlers => {FileName => sub {push @filenames, $_->text}}
);

$twig->parse(*DATA);
# $twig->parsefile('RepeatedElement.xml'); # you probably want this


say ">>$_<<"for @filenames;

__DATA__
<ConnectHome SchemaVersion="1.0.8">
  <TransType>0090</TransType>
  <Node>
    <ExternalFiles>
      <FileName>some file name</FileName>
    </ExternalFiles>
  </Node>
</ConnectHome>

您可以采用的另一种方法是使用一些基本的解析库,例如XML::Parser, XML::Parser::Expat, XML::TokeParserXML::LibXML然后自己组装文本,尽管对于这样一个简单的任务来说这可能太乏味了。

您还可以使用XML::XPathxpath是一种设计用于在 DOM 树中导航的查询语言):

use XML::XPath;

my $xp = XML::XPath->new(filename => 'RepeatedElement.xml');
my $filename = $xp->find('//FileName');
于 2015-02-12T07:42:40.877 回答