perl – 修复用于XML :: Twig的XPath谓词

前端之家收集整理的这篇文章主要介绍了perl – 修复用于XML :: Twig的XPath谓词前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试在Perl中编写一个子程序,它将在提供某些子节点的文本值时删除 XML中的给定节点.

@H_403_8@

给定的XML如下:@H_403_8@

@H_403_8@

<Path>
  <To>
    <My>
      <Node>
        <ChildA>ValA</ChildA>
        <ChildB>ValB</ChildB>
        <ChildC>ValC</ChildC>
      </Node>
    </My>
  </To>
</Path>
<!-- A lot of siblings follow... -->

我正在使用的XPath表达式基本上是:@H_403_8@

@H_403_8@

/Path/To/My/Node[ChildA="ValA" and ChildB="ValB" and ChildC="ValC"]

当我试图运行我的脚本时,我收到的错误如下:@H_403_8@

@H_403_8@

Error in XPath expression
/Path/To/My/Node[ChildA="ValA" and ChildB="ValB" and ChildC="ValC"] at 
ChildA="ValA" and ChildB="ValB" and ChildC="ValC" at Twig.pm line 3353

我为此感到茫然,正在寻找建议.我试过谷歌搜索,但我找不到尝试在XML :: Twig中使用这样的谓词的工作示例.我不知道问题出在我的XPath语法中,或者我是如何使用XML :: Twig的.@H_403_8@

为了更好的衡量,我也尝试过:@H_403_8@

@H_403_8@

/Path/To/My/Node[ChildA/text()="ValA" and ChildB/text()="ValB" and ChildC/text()="ValC"]

也没有运气.解决办法是什么?@H_403_8@

解决方法

在测试中,Node是上下文节点,因此您必须说:

@H_403_8@

@H_403_8@

/Path/To/My/Node[./ChildA="ValA" and ./ChildB="ValB" and ./ChildC="ValC"]

这适用于使用XML :: XPath的简短测试程序.@H_403_8@

编辑:对不起,我不太熟悉XML :: Twig,我对其XPath功能做了一个不正确的假设.根据文档,它仅支持“XPath-like”语法,但不会升级到示例的复杂程度.但是,如果您使用XML :: Twig :: XPath而不是XML :: Twig,那么您将获得完整的XPath引擎:@H_403_8@

@H_403_8@

my $twig = XML::Twig::XPath->new;
$twig->parse('your string');
my $nodes = $twig->findnodes('/Path/To/My/Node[ChildA="ValA" and ChildB="ValB" and ChildC="ValC"]');
print $nodes;

这将打印“ValAValBValC”.@H_403_8@

猜你在找的Perl相关文章