按名称Perl搜索XML元素值

按名称Perl搜索XML元素值,perl,xml-simple,Perl,Xml Simple,我基本上是一名java开发人员,但我的客户用perl给了我一个小任务。任务是获取xml输入,我需要搜索一个元素并打印它的值(将值保存在字符串变量中)。e、 g.在下面的xml中,我想读取FileName标记的值 <ConnectHome SchemaVersion="1.0.8"> <TransType>0090</TransType> <Node> <ExternalFiles> <FileName&

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

<ConnectHome SchemaVersion="1.0.8">
  <TransType>0090</TransType>
  <Node>
    <ExternalFiles>
      <FileName>some file name</FileName>
    </ExternalFiles>
  </Node>
</ConnectHome>
但是我的客户机希望使用元素名搜索值,因为路径在xml中可能会更改

"FileName"
而不是硬编码的路径


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

如果这是您唯一的任务,您可以切换到另一个库,如
XML::Twig
,这将使这变得更容易

不鼓励在新代码中使用此模块。还提供了其他模块,它们提供了更直观和一致的接口。特别推荐使用XML::LibXML

该模块的主要问题是选项数量庞大,以及这些选项之间的交互方式随意,通常会产生意想不到的结果

带有bug修复和文档修复的补丁是受欢迎的,但不太可能添加新功能

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


您是否绑定到
XML::Simple
?有了另一个图书馆会容易得多。不,我不一定要去。我也对其他图书馆开放。你能推荐一些图书馆来实现这一点吗?我还使用JSON库并将此xml转换为JSON。我可以使用JSON库获取它吗?发布了另外两个库的解决方案。我没有做太多的XML→ JSON转换是我自己做的,但是它应该可以通过
XML::Twig
实现。我对
XML::LibXML
不是很坚定,但可能会弹出另一个答案。非常感谢Patrick,它解决了我的问题。我使用了XML::XPath而不是XML::XPath,您可能需要使用XML::LibXML。代码将非常相似(XML::LibXML也实现了XPath),但速度更快,占用内存更少。加上XML::LibXML实际上是维护的,XML::XPath的最后一个版本是2003年发布的。@mirod:我几乎总是使用
XML::Twig
或其他解析器模块之一。我不想为我不熟悉的图书馆提出解决方案。@PatrickJ.S.没问题。感觉上我花了10年时间建议人们使用XML::LibXML而不是XML::XPath--(
"FileName"
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>
use XML::XPath;

my $xp = XML::XPath->new(filename => 'RepeatedElement.xml');
my $filename = $xp->find('//FileName');