为什么我不能使用XML :: LibXML中的XPath访问XML文件中的元素?

时间:2010-01-17 01:41:06

标签: perl xpath libxml2 xml-libxml

我有一个XML文件,其中一部分如下所示:

 <wave waveID="1">
    <well wellID="1" wellName="A1">
      <oneDataSet>
        <rawData>0.1123975676</rawData>
      </oneDataSet>
    </well>
    ... more wellID's and rawData continues here...

我试图用Perl的libXML解析文件,并使用以下命令输出wellName和rawData:

    use XML::LibXML;
    my $parser = XML::LibXML->new();
    my $doc = $parser->parse_file('/Users/johncumbers/Temp/1_12-18-09-111823.orig.xml');
    my $xc = XML::LibXML::XPathContext->new( $doc->documentElement()  );
    $xc->registerNs('ns', 'http://moleculardevices.com/microplateML');

            my @n = $xc->findnodes('//ns:wave[@waveID="1"]');   #xc is xpathContent
        # should find a tree from the node representing everything beneath the waveID 1
        foreach $nod (@n) {
            my @c = $nod->findnodes('//rawData');  #element inside the tree.
            print @c;
        }

现在没有打印任何内容,我认为我的Xpath语句有问题。请问你可以帮我解决一下吗,或者你能告诉我如何解决xpath语句问题吗?感谢。

2 个答案:

答案 0 :(得分:2)

不要在循环中使用findnodes,而是使用getElementsByTagName()

my @c = $nod->getElementsByTagName('rawData');

以下是使用@c数组处理的其他一些方便的方法:

$c[0]->toString;    # <rawData>0.1123975676</rawData>
$c[0]->nodeName;    # rawData
$c[0]->textContent; # 0.1123975676

答案 1 :(得分:2)

如果'wave'元素在命名空间中,那么'rawData'元素也是如此,所以你可能需要使用

foreach $nod (@n) {
    my @c = $xc->findnodes('descendant::ns:rawData', $nod);  #element inside the tree.
    print @c;
}