2010-01-17 2 views
2

내가의 일부 XML 파일을 가지고는 다음과 같습니다XML :: LibXML의 XPath로 XML 파일 안의 요소에 액세스 할 수없는 이유는 무엇입니까?

<wave waveID="1"> 
    <well wellID="1" wellName="A1"> 
     <oneDataSet> 
     <rawData>0.1123975676</rawData> 
     </oneDataSet> 
    </well> 
    ... more wellID's and rawData continues here... 

나는 다음과 같은 사용하여 펄의 libXML 및 출력 wellName과 RAWDATA 사용하여 파일을 구문 분석하는 것을 시도하고있다 :

use XML::LibXML; 
    my $parser = XML::LibXML->new(); 
    my $doc = $parser->parse_file('/Users/johncumbers/Temp/1_12-18-09-111823.orig.xml'); 
    my $xc = XML::LibXML::XPathContext->new($doc->documentElement() ); 
    $xc->registerNs('ns', 'http://moleculardevices.com/microplateML'); 

      my @n = $xc->findnodes('//ns:wave[@waveID="1"]'); #xc is xpathContent 
     # should find a tree from the node representing everything beneath the waveID 1 
     foreach $nod (@n) { 
      my @c = $nod->findnodes('//rawData'); #element inside the tree. 
      print @c; 
     } 

지금은 아무 것도 인쇄하지 않고 Xpath 문에 문제가 있다고 생각합니다. 제발 해결하도록 도와 주시겠습니까? 아니면 xpath 진술 문을 쏘는 방법을 보여줄 수 있습니까? 감사.

+0

나는이 XML 라이브러리를 모른다. 그러나 주목할 것은'ns :'네임 스페이스 접두어이다. XPath 컨텍스트에 있다고 선언 한 내용은 무엇입니까? XML 파일에 기본 네임 스페이스 선언이 있습니까? (한 장소에서'ns :'를 사용하는 것은 잘못된 것이고 다른 장소에서는 접두사가 사용되지 않을 것입니다.) –

+0

감사합니다. Kevin, 원래 질문에 네임 스페이스 행을 추가했습니다. 나는 당신이 제안한 것처럼 '// ns : rawData'를 시도했지만 "error : xmlXPathCompiledEval : evaluation failed"메시지가 나타납니다. – John

+0

죄송합니다, 귀하의 의견을 잘못 읽었습니다. 원본 XML 파일에 네임 스페이스 선언이 있습니다. John

답변

2

대신 루프 findnodes를 사용하는 getElementsByTagName()를 사용하십시오 "웨이브"요소가있는 경우

$c[0]->toString; # <rawData>0.1123975676</rawData> 
$c[0]->nodeName; # rawData 
$c[0]->textContent; # 0.1123975676 
2

: 여기

my @c = $nod->getElementsByTagName('rawData'); 

@c 배열 처리를 사용하는 어떤 다른 편리한 방법이다 네임 스페이스 다음에 'rawData'요소도 사용되어야합니다.

foreach $nod (@n) { 
    my @c = $xc->findnodes('descendant::ns:rawData', $nod); #element inside the tree. 
    print @c; 
} 
관련 문제