我有一个简单的xml文件,如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<microplateDoc xmlns="http://moleculardevices.com/microplateML">
<camelids>
<species name="Camelus bactrianus">
<common-name>Bactrian Camel</common-name>
<physical-characteristics>
<mass>450 to 500 kg.</mass>
<appearance>
Blah blah blah
</appearance>
</physical-characteristics>
</species>
</camelids>
</microplateDoc>
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下perl脚本读取物种名称:
use XML::LibXML;
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file('/Users/johncumbers/Documents/7_Scripts/Perl/XML_to_MySQL/simplified_camelids.xml');
my $xc = XML::LibXML::XPathContext->new( $doc->documentElement() );
$xc->registerNs('ns', 'http://moleculardevices.com/microplateML');
#loop through to find species nodes
my @n = $xc->findnodes('*/species'); #was */species
foreach $nod (@n) {
print "A: ".$nod->getAttribute("name")."\n";
my @c = $nod->findnodes('./common-name');
}
Run Code Online (Sandbox Code Playgroud)
但我没有找到任何节点.你能帮忙告诉我为什么它不起作用吗?什么是查找perl函数的最佳网站,以便我可以尝试自己解决这个问题?如何让脚本告诉我它正在做什么,因为此刻的输出只是一无所获.非常感谢.
您已将名称空间前缀与文档相关联,但您的XPath语法不使用它.
my @n = $xc->findnodes('//ns:species');
Run Code Online (Sandbox Code Playgroud)
应该做的工作.
没有前缀,你将无法匹配.此外,*/species路径仅匹配当前上下文中的子项(即文档的顶级).使用//species将查找species文档中的所有元素.如果这对您不起作用(因为该元素出现在文档中您不想匹配的其他上下文中),请使用
/*/*/ns:species
Run Code Online (Sandbox Code Playgroud)
因为元素是顶级的"曾孙子".
还有一个XPath参考.
| 归档时间: |
|
| 查看次数: |
3227 次 |
| 最近记录: |