首页 > 解决方案 > Perl XML:LibXML - 动态节点

问题描述

我一直在尝试用 perl 解析 xml。我有一个正常工作的静态树路径。但是,并非每个节点在不同的 xml 文件之间都保持不变。

我有这个代码。

foreach my $travelSections ($dom->findnodes('//TRAVELER[@NAME="Final Assembly - 1/16-Traveler"]/...')){

问题是 xml 到 xml 这会更改“ Final Assembly - 1/16-Traveler ”、“ Final Assembly - ”始终位于开头,而“ -Traveler ”始终位于末尾。中间的任何东西都可以改变。我如何使这更加动态?

标签: xmlperldynamicsubstring

解决方案


您传递给的参数findnodes()是一个 XPath 表达式。您的示例使用了一个简单的相等检查(这一点:),@NAME="Final Assembly - 1/16-Traveler但还有其他选项,包括您可以使用的XPath 函数。例如,contains()函数:

$dom->findnodes('//TRAVELER[contains(@NAME,"Final Assembly")]/...')

您还可以使用and来组合表达式:

$dom->findnodes('//TRAVELER[contains(@NAME,"Final Assembly") and contains(@NAME,"traveler")]/...')

这是您可以在XPath Sandbox中使用的示例。

我们也可以通过 XML::LibXML::XPathContext 注册您自己的函数,用 Perl 编写。请参阅文档的自定义 XPath 函数部分。


推荐阅读