我正在尝试在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"]
解决方法
在测试中,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@