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(现在通常是我正在测试的)
我的目的是创造一种新动物并将其添加到适当的区域
但是我有问题
my $area_element = $root -> findnodes("//area[\@id=$area]")->get_node(1);
不起作用,因为$ area_element是undef,因为findnodes总是返回一个空的节点列表(选中打印size())。
我认为问题是findnodes中的xpath表达式,但是我无法理解什么是错的,我使用与另一个库(XML :: XPath)相同的表达式并且它正在工作。
怎么了?
答案 0 :(得分:4)
XML中的deafult命名空间的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>
元素。
答案 1 :(得分:-2)
命名空间声明是错误的,应该说<zoo xmlns:zoo="http://www.zoo.com"
之类的。