Perl의 xml :: libxml에서 속성 및 요소에 액세스하려면 어떻게해야합니까?
-
19-09-2019 - |
문제
나는 이름 공간을 이해 / 사용하는 데 어려움을 겪고 있습니다. xml :: libxml Perl의 패키지. 요소에 성공적으로 액세스 할 수는 있지만 속성은 없습니다. XML 파일에 액세스하는 다음 코드가 있습니다 (http://pastebin.com/f3fb9d1d0).
my $tree = $parser->parse_file($file); # parses the file contents into the new libXML object.
my $xpc = XML::LibXML::XPathContext->new($tree);
$xpc->registerNs(microplateML => 'http://moleculardevices.com/microplateML');
그런 다음 Common-Name이라는 요소와 이름이라는 속성에 액세스하려고합니다.
foreach my $camelid ($xpc->findnodes('//microplateML:species')) {
my $latin_name = $camelid->findvalue('@name');
my $common_name = $camelid->findvalue('common-name');
print "$latin_name, $common_name" ;
}
그러나 라틴 이름 만 (@name
) 인쇄 중이고, 공통 이름은 그렇지 않습니다. 내가 무엇을 잘못하고 있는지, 어떻게 공동 이름을 인쇄 할 수 있습니까?
이 경우 @Name은 무엇을합니까? 나는 그것이 배열이라고 가정하고, 그 속성은 둘 이상이있을 수 있으므로 배열에 넣어야하지만, 공통 이름과 같은 요소가 하나만 있어야합니까?
여기에서 예제를 따르고 있습니다. http://www.xml.com/pub/a/a/a/a/a/14/xml-libxml.html그리고 여기: http://perl-xml.sourceforge.net/faq/#namespaces_xpath, 그리고 예제 낙타 스크립트를 내 네임 스페이스로 작동 시키려고 노력하므로 이상한 네임 스페이스가됩니다.
해결책
XML 파일이 유효한지 확인한 다음 사용하십시오 $node->getAttribute("someAttribute")
속성에 액세스하려면.
@Name은 속성 이름입니다. 주어진 속성 세트가있는 요소를 지정하기 위해 findnodes ()에서 사용합니다. 예를 들어. 같은 길 :
//camelids/species[@name="Camelus bactrianus"]/
간단하고 고안된 예는 다음과 같습니다.
#!/usr/bin/perl -w
use XML::LibXML;
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file('/Users/castle/Desktop/animal.xml');
my $xc = XML::LibXML::XPathContext->new( $doc->documentElement() );
$xc->registerNs('ns', 'http://moleculardevices.com/microplateML');
my @n = $xc->findnodes('//ns:species');
foreach $nod (@n) {
print "A: ".$nod->getAttribute("name")."\n";
my @c = $xc->findnodes("./ns:common-name", $nod);
foreach $cod (@c) {
print "B: ".$cod->nodeName;
print " = ";
print $cod->getFirstChild()->getData()."\n";
}
}
출력은 다음과 같습니다.
perl ./xmltest.pl
A: Camelus bactrianus
B: common-name = Bactrian Camel