【发布时间】:2013-04-16 16:04:11
【问题描述】:
我正在尝试解析具有以下结构的类似 XML 的文件:
编辑: 我试图省略大部分巨大的 xml 文件以简化所有内容,但 c/p-ed 错误。这是实际存在此问题的完整文件(900kb!):https://docs.google.com/file/d/0B3ustNI1qZh1UURrYWZJQk0wVlU/edit?usp=sharing
<CIM CIMVERSION="2.0" DTDVERSION="2.0">
<DECLARATION>
<DECLGROUP>
<LOCALNAMESPACEPATH>
<NAMESPACE NAME="signalingsystem"/>
</LOCALNAMESPACEPATH>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="SharedGtTranslator">
<PROPERTY NAME="Name" TYPE="string">
<VALUE>AUC$4,1,6,4,26202*-->AUC RemoteSPC: 300 SSN: 10</VALUE>
</PROPERTY>
<PROPERTY NAME="NatureOfAddress" TYPE="sint32">
<VALUE>4</VALUE>
</PROPERTY>
</INSTANCE>
</VALUE.OBJECT>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="SharedGtTranslator">
<PROPERTY NAME="Name" TYPE="string">
<VALUE>AUC$4,2,6,4,26202*-->AUC AUC LocalSPC: 410 SSN: 10</VALUE>
</PROPERTY>
<PROPERTY NAME="NatureOfAddress" TYPE="sint32">
<VALUE>4</VALUE>
</PROPERTY>
<VALUE>2</VALUE>
</PROPERTY>
</INSTANCE>
</VALUE.OBJECT>
</DECLGROUP>
</DECLARATION>
</CIM>
我正在使用 XMLSimple 来解析该结构。
如果CLASSNAME="SharedGtTranslator",我需要获取属性NAME="Name" 的所有值。
这就是我想要做的:
#!/usr/bin/perl
use strict;
use warnings;
# use module
use XML::Simple;
use Data::Dumper;
my $file1 = $ARGV[0];
# create object
my $xml = new XML::Simple;
# read XML file
my $data = $xml->XMLin($file1);
foreach my $object (@{$data->{DECLARATION}->{DECLGROUP}->{'VALUE.OBJECT'}}) {
if ($object->{INSTANCE}->{CLASSNAME} eq 'SharedGtTranslator') {
foreach my $property (@{$object->{INSTANCE}->{PROPERTY}}) {
if ($property->{NAME} eq 'Name') {
print $property->{VALUE} . "\n";
}
}
}
}
得到
“伪散列已弃用”
什么都没有发生。
非常感谢您的帮助!
【问题讨论】:
-
您的 XML 缺少 PROPERTY 标记。当我修复它时,您提供的代码可以正常工作,但未初始化的警告除外。
-
实际上这是我的错误。我试图省略大部分巨大的 xml 文件以简化所有内容,但 c/p-ed 错误。这是完整的文件(900kb!):docs.google.com/file/d/0B3ustNI1qZh1UURrYWZJQk0wVlU/…
-
当您尝试像一个 hashref 一样对 arrayref 进行索引时,会出现神秘的“不推荐使用伪哈希”消息。我推荐简短但内容丰富的Perl references tutorial 我也同意@Borodin 的建议,改为使用 XML::LibXML。
标签: xml perl hash xml-simple