문제

나는 이름 공간을 이해 / 사용하는 데 어려움을 겪고 있습니다. 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top