كيف يمكنني الوصول إلى السمات والعناصر من XML :: LIBXML في بيرل؟

StackOverflow https://stackoverflow.com/questions/2039143

سؤال

أواجه مشكلة في فهم / باستخدام مسافات الأسماء مع XML :: LIBXML. حزمة في بيرل. يمكنني الوصول إلى عنصر بنجاح ولكن ليس سمة. لدي التعليمات البرمجية التالية التي تصل إلى ملف 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');   

ثم أحاول ثم الوصول إلى عنصر يسمى الاسم الشائع وسمة يسمى الاسم.

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) الطباعة، والاسم المشترك ليس كذلك. ماذا أفعل الخطأ وكيف يمكنني الحصول على الاسم المشترك للطباعة كذلك؟

ماذا يفعل LAME في هذه الحالة؟ أفترض أنها صفيف، وينبغي وضع هذه الصفات في صفيف حيث يمكن أن يكون هناك أكثر من واحد، لكن العناصر (مثل الاسم المشترك) لا ينبغي أن تكون لأن هناك مجرد واحدة؟

لقد كنت أتابع الأمثلة هنا: http://www.xml.com/pub/a/2001/11/14/xml-libxml.html.html.و هنا: http://perl-xml.sourceforge.net/faq/#namespaces_xpath., ، ومحاولة الحصول على مثالهم النصي الجمل يعمل مع مساحة اسمي، وبالتالي مساحة الاسم الغريبة.

هل كانت مفيدة؟

المحلول

تأكد من أن ملف XML صالح ثم استخدمه $node->getAttribute("someAttribute") للوصول إلى السمات.

lname هو اسم السمة. كنت تستخدمه في 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