2017-09-20 1 views
0

XML 파일에서 일부 문자열을 추출하고 싶습니다. 다음과 같이 나의 XML 파일 : -어떻게 XML 파일에서 값을 추출 할 수 있습니까?

<PartNumber name="750"> 
    <SubComponent name="FPGA"> 
     <SubComponentItem name="0" device_name="golden" desc="GPCAM FPGA Golden Image" rev="0x002a0023" type="FPGA_T6E_PIC" cache="yes" /> 
     <SubComponentItem name="1" device_name="user" desc="GPCAM FPGA User Image" rev="0x002a0023" type="FPGA_T6E_PIC" cache="yes" /> 
    </SubComponent> 
    <SubComponent name="LTC"> 
     <SubComponentItem name="0" desc="ltc3880-1.0v-0" rev="0x0003" type="PMBUS_T6E_QSFP28" device_name="ltc3880-1.0v" index="0xb4" /> 
     <SubComponentItem name="1" desc="ltc3880-3.3v" rev="0x0003" type="PMBUS_T6E_QSFP28" device_name="ltc3880-3.3v" index="0xb4" /> 
    </SubComponent> 
    <SubComponent name="EEPROM"> 
     <SubComponentItem name="0" desc="BCM8238X Retimer 0 ver"  device_name="SLOT_NUMBER/%SLOT_NUMBER/0" rev="D00E"  type="BCM8238X_EEPROM" cache="yes" /> 
     <SubComponentItem name="1" desc="BCM8238X Retimer 0 checksum" device_name="SLOT_NUMBER/%SLOT_NUMBER/0" checksum="600D" type="BCM8238X_EEPROM" cache="yes" /> 
     <SubComponentItem name="2" desc="BCM8238X Retimer 1 ver"  device_name="SLOT_NUMBER/%SLOT_NUMBER/0" rev="D00E"  type="BCM8238X_EEPROM" cache="yes" /> 
     <SubComponentItem name="3" desc="BCM8238X Retimer 1 checksum" device_name="SLOT_NUMBER/%SLOT_NUMBER/0" checksum="600D" type="BCM8238X_EEPROM" cache="yes" /> 
    </SubComponent> 
</PartNumber> 

예를 들어 내가 PARTNUMBER 이름 = 750과 SubComponentItem 이름 = FPGA 내부의 회전 값을 추출 할. 어떻게 추출 할 수 있습니까? 당신의 정보, 내 펄 버전 5.8.8 및 XML :: libxml 또는 XML에 대한

use strict; 
    use warnings; 
    use XML::Simple; 
    use Data::Dumper; 

    my $simple = XML::Simple->new(); 
    my $data = $simple->XMLin('/cy/programable/1ProgrammableRevision.xml'); 

    print Dumper($data) . "\n"; 

    print $data->{PartNumber}->{750}->{FPGA}->{0}->{rev}->[1]; 

:: 나뭇 가지가 있습니다 : -

내가 코드를 아래에 시도했지만 여전히 몇 가지 오류가 발생했다가, 아래에있는 내 코드입니다 해당 사항 없음. 이 작업은 xpath를 사용하여 훨씬 쉽게, 그리고 그것을 위해 당신은 XML::LibXML 또는 XML::Twig 필요 -

+3

왜 라이브러리를 설치하겠습니까 ('XML :: Simple'은 핵심이 아닙니다). – Sobrique

+1

XML :: Simple은 좋지 않습니다. 나중에 Twig를 사용하십시오. –

+1

나는 XML :: Twig와 같이 시작하기 쉽다. 나는 완전히 특색 있고 강력하기 때문에'XML :: LibXML'을 좋아한다. – Sobrique

답변

6

XML::Simple 사용하지 마십시오. xpath의 미묘한의

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Twig; 

my $twig = XML::Twig -> parsefile ('/cy/programable/1ProgrammableRevision.xml'); 

my $value = $twig -> get_xpath('//PartNumber[@name="750"]/SubComponent[@name="FPGA"]/SubComponentItem[@device_name="user"]',0) -> att('rev'); 

print $value; 

하나는 부분 경로로 할 수있다 - 당신이 "FPGA_T6E_PIC"을 찾고 알고 말할 수 :

my $value = $twig -> get_xpath('//SubComponentItem[@type="FPGA_T6E_PIC"]',0) -> att('rev'); 
print $value; 
-3

을 간단한 정규 표현식으로?

my $name=''; 

if (/<PartNumber ([^>]+)>/) { 
    my $PN_attr=$1; 
    if ($PN_attr =~ /name="([^"]*)"/) { 
     $name=$1; 
    } 
} 

print $name; 

[^>]+ 방식은 < … > 블록 내부의 끝 구분 기호가 일치하지 않는 것입니다.

+1

https://stackoverflow.com/questions/6751105/why-its-not-possible-to-use-regex-to-parse-html-xml-a-formal-explanation-in-la –

관련 문제