5

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です)

私の目的は、新しい動物を作成し、それを適切な領域に追加することです

しかし、私はistructionという問題があります

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

$ area_elementがundefであるため、動作しません。これは、findnodesが常に空のノードリストを返すためです(size()の出力をチェック)。

問題はfindnodes内のxpath式だと思いますが、何が問題なのか理解できません。同じ式を別のライブラリ(XML :: XPath)で使用しており、機能しています。

どうしたの?

4

2 に答える 2

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>そして、あなたは正しい要素を見つけるでしょう。

于 2012-05-30T18:37:52.647 に答える
-2

名前空間の宣言が間違っている、と言うべき<zoo xmlns:zoo="http://www.zoo.com"です。

于 2012-05-30T18:19:27.353 に答える