2017-09-20 6 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> 

例えばiは製品型番名= 750とSubComponentItem名= FPGA内部の回転値を抽出したいです。どのように私はそれを抽出することができますか?私は以下のコードの下にしようとしたが、まだいくつかのエラーが発生しました

は私のコードです: - あなたの情報について

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]; 

、私のPerlのバージョン5.8.8、およびXML ::のlibxmlまたはXML ::小枝がされています適用できません。

+3

なぜあなたは明らかに優れているときに、1つのライブラリ( 'XML :: Simple'はコアではありません)をインストールしますが、他のものはインストールしませんか? – Sobrique

+1

XML :: Simpleは嫌なものです。後でTwigを使用してください。 –

+1

私はXML :: Twigを使い始めるのが好きです。私は 'XML :: LibXML'が完全に機能し強力であることが好きです。 – Sobrique

答えて

6

XML::Simpleを使用しないでください - このタスクはxpathを使用してはるかに簡単であり、そのためにあなたはXML::LibXMLXML::Twigを必要としています。 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 –

関連する問題