gpt4 book ai didi

xml - findnodes() 中的 xpath 表达式返回空节点列表

转载 作者:数据小太阳 更新时间:2023-10-29 01:58:36 26 4
gpt4 key购买 nike

XML:

<zoo xmlns="http://www.zoo.com" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://www.zoo.com employee.xsd">

<area id="1" posizione="nord" nome="scimmie">
<animale>
<nome>Gigi</nome>
<sesso>Male</sesso>
<eta>3</eta>
</animale>

<animale>
<nome>Gigia</nome>
<sesso>Female</sesso>
<eta>2</eta>
</animale>
</area>

<area id="2" posizione="nord" nome="giraffe">
<animale>
<nome>Giro</nome>
<sesso>Male</sesso>
<eta>6</eta>
</animale>

<animale>
<nome>Gira</nome>
<sesso>Female</sesso>
<eta>5</eta>
</animale>
</area>
</zoo>

代码:

my $parser = XML::LibXML->new;
my $doc = $parser->parse_file("../xml/animals.xml");
my $root = $doc->getDocumentElement();

my $new_animal = $doc->createElement("animale");

my $name_element = $doc->createElement("nome");
$name_element->appendTextNode($name);

my $gender_element = $doc->createElement("sesso");
$gender_element->appendTextNode($gender);

my $age_element = $doc->createElement("eta");
$age_element->appendTextNode($age);

$new_animal->appendChild($name_element);
$new_animal->appendChild($gender_element);
$new_animal->appendChild($age_element);

my $area_element = $root -> findnodes("//area[\@id=$area]")->get_node(1);

$area_element->appendChild($new_animal);

$area 是一个区域的 id(我现在正在测试,通常是 1)

我的目的是创造一种新动物并将其添加到适当的区域

但是我遇到了指令的问题

    my $area_element = $root -> findnodes("//area[\@id=$area]")->get_node(1);

不会工作,因为 $area_element 是 undef,因为 findnodes 总是返回一个空的节点列表(检查打印 size())。

我认为问题出在 findnodes 中的 xpath 表达式,但我不明白哪里出了问题,我将相同的表达式与另一个库 (XML::XPath) 一起使用并且它正在工作。

怎么了?

最佳答案

XML 中默认 namespace 的 URI 是 http://www.zoo.com , 因此您必须在 XPath 表达式中为要拾取的节点指定此项。

这样做的方法是声明一个 XML::LibXML::XPathContext为该命名空间分配名称的对象。然后可以在 XPath 表达式中使用该名称来访问节点。

如果你写

my $xpc = XML::LibXML::XPathContext->new;
$xpc->registerNs('zoo', 'http://www.zoo.com');

您现在有一个上下文,其中 XML 的默认命名空间名为 zoo .现在你可以写了

my $area_element = $xpc->findnodes("//zoo:area[\@id=$area]", $doc)->get_node(1);

你会找到正确的<area>元素。

关于xml - findnodes() 中的 xpath 表达式返回空节点列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10821028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com