按名称搜索 XML 元素值 Perl
Search XML Element Value By Name Perl
我基本上是一名 java 开发人员,但我的客户让我在 perl 中完成一些小任务。任务是我将获得 xml 输入,因为我需要搜索一个元素并打印它的值(将值保存在 String 变量中)。例如在下面 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"
而不是硬编码路径。
所以我的问题是如何通过元素名称而不是硬编码路径获取值?有没有一种方法可以按名称搜索元素?我将在字符串变量中传递元素名称。
如果这是你唯一的任务,你可以切换到另一个库,比如 XML::Twig
,这样会容易很多。
Also consider this note from XML::Simple
's documentation
The use of this module in new code is discouraged. Other modules are available which provide more straightforward and consistent interfaces. In particular, XML::LibXML is highly recommended.
The major problems with this module are the large number of options and the arbitrary ways in which these options interact - often with unexpected results.
Patches with bug fixes and documentation fixes are welcome, but new features are unlikely to be added.
这是一个使用 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::TokeParser
、XML::LibXML
和 assemble 自己的文本,虽然这对于这样一个简单的任务来说可能太乏味了。
您也可以使用 XML::XPath
(xpath 是一种设计用于在 DOM 树中导航的查询语言):
use XML::XPath;
my $xp = XML::XPath->new(filename => 'RepeatedElement.xml');
my $filename = $xp->find('//FileName');
我基本上是一名 java 开发人员,但我的客户让我在 perl 中完成一些小任务。任务是我将获得 xml 输入,因为我需要搜索一个元素并打印它的值(将值保存在 String 变量中)。例如在下面 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"
而不是硬编码路径。
所以我的问题是如何通过元素名称而不是硬编码路径获取值?有没有一种方法可以按名称搜索元素?我将在字符串变量中传递元素名称。
如果这是你唯一的任务,你可以切换到另一个库,比如 XML::Twig
,这样会容易很多。
Also consider this note from XML::Simple
's documentation
The use of this module in new code is discouraged. Other modules are available which provide more straightforward and consistent interfaces. In particular, XML::LibXML is highly recommended.
The major problems with this module are the large number of options and the arbitrary ways in which these options interact - often with unexpected results.
Patches with bug fixes and documentation fixes are welcome, but new features are unlikely to be added.
这是一个使用 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::TokeParser
、XML::LibXML
和 assemble 自己的文本,虽然这对于这样一个简单的任务来说可能太乏味了。
您也可以使用 XML::XPath
(xpath 是一种设计用于在 DOM 树中导航的查询语言):
use XML::XPath;
my $xp = XML::XPath->new(filename => 'RepeatedElement.xml');
my $filename = $xp->find('//FileName');