为什么我从getElementsByTagName获得"无效谓词"错误?

Dik*_*kla 4 xml perl

我有以下XML:

<config>
  <version general="1.2.3">
    <subtype type="a" version="1.2" />
    <subtype type="b" version="3.6" />
    ...
  </version>
  ...
</config>
Run Code Online (Sandbox Code Playgroud)

我在Perl中有一些代码来从数据库中获取配置节点.

在我得到它后,如果我尝试以下方法:

my $elem = $cfg->getElementsByTagName("version");
my $generalVer = $elem ? $elem->get_node(1)->getAttribute("general") : undef;
Run Code Online (Sandbox Code Playgroud)

一切正常,$generalVer包含1.2.3,如预期的那样.

但如果我试试这个:

my $elem = $cfg->getElementsByTagName("version/subtype[@type='a']");
my $aVersion = $elem ? $elem->get_node(1)->getAttribute("version") : undef;
Run Code Online (Sandbox Code Playgroud)

它失败并显示"无效谓词"消息.

有人可以帮助解决这个问题吗?

fri*_*edo 9

我强烈怀疑这"version/subtype[@type='a']"不是标签名称.这看起来像一个XPath查询.

我假设你正在使用像XML :: DOM这样的东西来解析这个XML.如果你想使用XPath,那么你可以使用XML :: DOM :: XPath,它增加了XPath支持.

例如,

 use XML::DOM;
 use XML::DOM::XPath;
 ...
 my $elem = $cfg->findnodes( q{//version/subtype[@type='a']} );
Run Code Online (Sandbox Code Playgroud)

  • 我怀疑你想单引这个论点.:) (3认同)

Dik*_*kla 5

谢谢大家的答案.

在我问这个问题后的短时间内,有人回答说问题是单引号,如果我使用双引号就行了.即@type=" a"而不是@type=" a".

嗯,这确实解决了它.但当我试图将他的答案标记为正确的答案时,我发现他删除了它.

所以我自己发布了答案,只是为了记录.

以下代码工作得很好:

my $elem = $cfg->getElementsByTagName("version/subtype[@type=\"a\"]");
my $aVersion = $elem ? $elem->get_node(1)->getAttribute("version") : undef;
Run Code Online (Sandbox Code Playgroud)

谢谢.