【问题标题】:How can i extract value in xml file?如何在 xml 文件中提取值?
【发布时间】:2017-09-20 08:48:22
【问题描述】:

我想从 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 中的 rev 值。我怎样才能提取它?并存储它。

我试过下面的代码,但还是遇到了一些错误,下面是我的代码:-

  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::Twig 不适用。

【问题讨论】:

  • 为什么要安装一个库(XML::Simple 不是核心)而不是其他库,当它们明显更好时?
  • XML::Simple is Nasty.. 评价者使用 Twig。
  • 我喜欢XML::Twig,因为它易于上手。我喜欢XML::LibXML,因为它功能齐全且功能强大。
  • 我不明白为什么有人会在阅读the warnings in the documentation 后使用 XML::Simple。
  • 您可以在本地安装模块。但如果你不能,请通读"Why is XML::Simple discouraged" 并安装替代品。

标签: xml perl


【解决方案1】:

不要使用XML::Simple - 使用xpath 更容易完成此任务,为此您需要XML::LibXMLXML::Twig

#!/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;

xpath 的优点之一是您可以找到部分路径 - 假设您知道您正在寻找“FPGA_T6E_PIC”:

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

【讨论】:

    【解决方案2】:

    用一个简单的正则表达式?

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

    [^&gt;]+ 方案不匹配 &lt; … &gt; 块内的结束分隔符。

    猜你喜欢
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 2014-09-27
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2020-04-17
    相关资源
    最近更新 更多