【问题标题】:how to read the value of specific tag within an xml using perl如何使用perl读取xml中特定标签的值
【发布时间】:2020-06-15 07:04:06
【问题描述】:

对于下面的check1.xml

<root>
  <setup name = "abc" version="1.1.1>
    <func>
       <comp name = "cba">
          <check>type</check>  
       </comp> 
    </func>
  </setup> 
</root>

我可以使用以下内容提取 comp 的字段内容

my $lib = "check1.xml"; 
my $simple = XML::Simple->new();
my $tree = $simple->XMLin($lib);
print $tree->{setup}->{func}->{comp}->{name} ;

有了这个,我可以打印“cba”。我用 Dumper 函数打印了 $tree 以获取哈希,并且我能够构造语法来打印相同的内容。 p>

但是,当我有多个 comp 标签时,我遇到了问题。

<root>
  <setup name = "abc" version="1.1.1">
    <func>
       <comp name = "cba">
          <check>type</check>  
       </comp> 
       <comp name = "cdf">
          <check>semi</check>  
       </comp> 
       <comp name = "mno">
          <check>auto</check>  
       </comp> 
       <comp name = "xyz">
          <check>manual</check>  
       </comp>     
    </func>
  </setup> 
</root>

我如何在此处获取值,因为我什么时候为此转储散列,我没有得到相同的标签,因为我没有看到我可以在散列中访问任何元素以获取我需要的信息。

$VAR1 = {
          'setup' => {
                     'func' => {
                               'comp' => {
                                         'cdf' => {
                                                  'check' => 'semi'
                                                },
                                         'mno' => {
                                                  'check' => 'auto'
                                                },
                                         'cba' => {
                                                  'check' => 'type'
                                                },
                                         'xyz' => {
                                                  'check' => 'manual'
                                                }
                                       }
                             },
                     'name' => 'abc',
                     'version' => '1.1.1'
                   }
        };

我想从上面的哈希中提取 comp 名称值到一个数组。有人可以在这里给我一些指示。 即获取 cdf、mno、xyz、cba...

【问题讨论】:

  • 正如 Grinnz 所说,不要使用 XML::Simple。我是 XML::Simple 的作者,我同意这很糟糕。我写了这个guide to using XML::LibXML 来帮助人们摆脱 XML::Simple。
  • 谢谢。会记住这一点。
  • 嗨,格兰特,我查看了您的指南,非常有帮助。我可以用你的例子解决我的问题。

标签: xml perl


【解决方案1】:

这是XML::Simple is discouraged 的一个重要原因。 XML 根本无法有效地映射到 Perl 数据结构,因此返回的 XML 的细微差别需要非常不同的 Perl 数据结构。

相反,像 XML::LibXMLMojo::DOM 这样的 XML 解析器可以以一致的方式遍历和检索数据,无论您返回多少项目。以下是您可以使用 Mojo::DOM 解决此问题的方法:

use strict;
use warnings;
use Mojo::DOM;

my $xml = <<'XML';
<root>
  <setup name = "abc" version="1.1.1">
    <func>
       <comp name = "cba">
          <check>type</check>  
       </comp> 
       <comp name = "cdf">
          <check>semi</check>  
       </comp> 
       <comp name = "mno">
          <check>auto</check>  
       </comp> 
       <comp name = "xyz">
          <check>manual</check>  
       </comp>     
    </func>
  </setup> 
</root>
XML

my $dom = Mojo::DOM->new->xml(1)->parse($xml);
my $names = $dom->find('root > setup > func > comp')->map(attr => 'name');
print "$_\n" for @$names;

# equivalent, in more steps:
my $comps = $dom->find('root > setup > func > comp');
foreach my $comp (@$comps) {
  print $comp->attr('name'), "\n";
}

【讨论】:

  • 我使用了格兰特示例,我能够解决问题。我尝试了您的解决方案,但没有奏效。抱歉延迟回复。
  • 这个例子是功能性的。很高兴你有一个可行的解决方案。
  • 非常感谢您的意见。
【解决方案2】:

$tree-&gt;{setup}-&gt;{func}-&gt;{comp} 是一个哈希引用,其中name 属性是键,所以

@comp_names = keys %{$tree->{setup}{func}{comp}};

【讨论】:

  • 不是只有一个comp标签的时候,就是这里的XML::Simple问题。
  • 真实数据。 . . .
  • 我使用了 XML::LibXML perl 包,它对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多