XML: найти конкретный узел в XML с использованием LibXML - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть файл XML, в котором есть только один узел с именем import.Я хочу найти атрибут импорта href.Я попытался использовать findnodes (), но он возвращает список, который мне нужно искать дальше, поэтому я надеялся, что есть способ найти конкретный узел, который имеет только один случай.Я пробовал getChildrenByTagName, но это выдает ошибку

Can't locate object method "getChildrenByTagName" via package "XML::LibXML::Document"

Я также пробовал grep, который выдает похожую ошибку

Can't locate object method "grep" via package "XML::LibXML::Document"

Мой XML-файл:

<?xml version="1.0" encoding="UTF-8"?>
<resource name="data" type="application/dictionary+xml">
<schema>
    <import href="tobefound.xml"/>
</schema>
</resource>

Myпока код

#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML;

my $name = $ARGV[1];
my $dom = XML::LibXML->load_xml(location => $name);
my @node= $dom->findnodes('//import');
print "List: @node\n";

Пожалуйста, дайте мне знать, если есть способ найти только один конкретный узел без необходимости обхода всего домена и без необходимости сохранять его в виде списка.Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

getChildrenByTagName - это метод узлов элемента, а не узлов документа.

my $doc = XML::LibXML->load_xml(location => $name);
my $root_ele = $doc->documentElement();
my ($import_ele) = $root_ele->getChildrenByTagName('import');

Вы также можете использовать XPath, хотя эквивалентный XPath будет import (поиск детей), а не //import (ищет потомков).

my $doc = XML::LibXML->load_xml(location => $name);
my ($import_ele) = $doc->findnodes('import');

Возвращает все import узлы и сохраняет первый.Но можно указать поиску прекратить поиск после нахождения первого следующим образом:

my $doc = XML::LibXML->load_xml(location => $name);
my ($import_ele) = $doc->findnodes('import[1]');  # Short for 'import[position()=1]'
0 голосов
/ 04 декабря 2018

XML не гарантирует уникальность, поэтому любой вид поиска вернет список результатов.Этот список может иметь длину 0 или 1, как и в случае с grep.

. Но простой ответ состоит в том, чтобы просто получить первый результат:

my ($node) = $dom -> findnodes('//import');

, если это не удалось - укажите вxpath:

my ( $node ) = $dom -> findnodes ( '(//import)[1]' ); 

Боюсь, я не знаю, будет ли последний действительно спасаться, когда было выбрано «достаточно» узлов.

...