我有以下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)
它失败并显示"无效谓词"消息.
有人可以帮助解决这个问题吗?
我强烈怀疑这"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)
谢谢大家的答案.
在我问这个问题后的短时间内,有人回答说问题是单引号,如果我使用双引号就行了.即@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)
谢谢.