2009-06-22 3 views
1

XML :: Simple을 사용하고 Perl 코드를 통해 액세스해야하는 변수 $ xmldata에 다음 XML 구조가 있습니다.XML :: Simple을 사용하여 Perl에서 중첩 된 XML 구조의 심층 데이터에 액세스하려면 어떻게해야합니까?

이제
$aval = $xmldata->{a}[0]; 
$bval = $xmldata->{b}[0] ; 

, 내 질문은 : 나는 D2, 말의 가치를 얻을 수있는 방법

<root> 
    <a>sfghs</a> 
    <b>agaga</b> 
    <c> 
     <c1>sgsfs</c1> 
     <c2>sgsrsh</c2> 
    </c> 
    <d> 
     <d1>agaga</d1> 
     <d2>asgsg</d2> 
    </d> 
</root> 

나는 다음과 같은 코드를 사용하여는 A의 값과 B 액세스 할 수 있습니까?

+0

답변을 삭제했습니다. newt의 대답은 문제를 해결하기 때문에 올바른 것으로 표시해야합니다. –

답변

5

위의 내용을 감안할 때 ForceArray 플래그가 활성화되어 있다고 가정합니다. 중첩 키는 참조를 사용하여 해시의 해시로 저장됩니다. ,

my $d2val = $xmldata->{d}[0]->{d2}[0]; 

(또는 내 취향)

my $d2val = $xmldata->{d}->[0]->{d2}->[0]; 

분명히 (이 명백한 DEREF을 만들기 때문에 일) :

그래서, 'D2'를 액세스 할 수는 사용해야합니다 이 더 무서운 곳으로 가면 깊어 질거야. 이것이 거의 항상 XML :: Simple 대신 XML::LibXML과 XPath를 제안하는 이유 중 하나입니다. XML :: Simple은 빠르게 단순하지 않습니다. XML::Simple docs은 다양한 옵션이이 레이아웃에 어떻게 영향을 줄 수 있는지 설명합니다.

Data::Dumper은 데이터 배치 방법을보고 싶을 때 매우 중요합니다.

+0

@newt 참고 : 정답으로 표시 될 수있는 완전한 대답이 하나 있도록 내 대답을 삭제하고 여기에 Data :: Dumper에 참조를 입력합니다. –

+1

내 $ d2val = $ xmldata -> { 'd'} [0] { 'd2'} [0];이어야하지 않습니까? (차이점은 { 'd'이후의 [0]에 있지만 여전히 ForceArray => 1입니다.) 큰 문서의 경우 XML :: Parser :: PerlSAX를 좋아합니다. - 그들을 파서). – Anon

+0

@Anon, 그렇습니다. 당신은 절대적으로 옳습니다. 내 실수. 대답 –