这是我的xml文件:
data.xml中
<?xml version="1.0" encoding="UTF-8"?>
<ns1:BoardTestXMLExport numberOfIndictedComponents="6" testerTestStartTime=".00000:00" testTime=".00000:00" repairStationId="vvts03" testStatus="Reviewed Passed" testerTestEndTime=".00000:00" xmlns:ns1="http://tempuri.org/BoardTestXMLExport.xsd" numberOfIndictedPins="0" numberOfComponentsTested="113" numberOfJointsTested="0" numberOfDefects="6" repairStatus="Reviewed Passed">
<ns1:StationXML testerName="huaemsaoi004" stage="V510"/>
<ns1:TestXML name="d1">
<ns1:IndictmentXML algorithm="bep-3a98730h01l-lf" indictmentType="OCV Fail">
<ns1:RepairActionXML repairOperator="1066689" repairTime="2017-11-24T11:35:32.000+08:00" repairActionType="-" indictmentType="OCV Fail" comment="-" repairStatus="False Call"/>
<ns1:ComponentXML packageId="EP-3A98730H01L-LF" partId="EP-3A98730H01L-LF" designator="d1"/>
</ns1:IndictmentXML>
</ns1:TestXML>
<ns1:TestXML name="r2">
<ns1:IndictmentXML algorithm="rep-as30112h42l-lf" indictmentType="Right off">
<ns1:RepairActionXML repairOperator="1066689" repairTime="2017-11-24T11:35:32.000+08:00" repairActionType="-" indictmentType="Right off" comment="-" repairStatus="False Call"/>
<ns1:ComponentXML packageId="EP-AS30112H42L-LF" partId="EP-AS30112H42L-LF" designator="r2"/>
</ns1:IndictmentXML>
</ns1:TestXML>
</ns1:BoardTestXMLExport>
我使用了跟随代码来打印“IndictmentType”和“name”,但它无法打印出来,代码如下:
# use module
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
# create object
my $xml = XML::Simple->new;
# read XML file
my $data = $xml->XMLin("data.xml",KeyAttr=>"ns1");
print Dumper($data);
print $data ->{"ns1:TestXML"}->{"ns1:IndictmentXML"}->{"IndictmentType"};
print $data ->{"ns1:TestXML"}->{"ns1:IndictmentXML"};
答案 0 :(得分:3)
当我在我的机器上尝试时,您的代码可以正常工作。当然,因为你发布了你的代码图片,而不是将其作为文本发布(我不知道为什么人们认为这很有用 - 你只是讨厌那些你要求帮助你的人!),我不得不重新键入你的代码,我可能“意外”修复了导致你问题的错误 - 我怀疑你试图打印的密钥大写不匹配。
了解您正在使用的XML :: Simple版本也会有所帮助。您可能正在遇到更新版本中已修复的错误。
值得指出一些事情。首先,XML::Simple的文档包含以下文字:
此模块的状态
不鼓励在新代码中使用此模块。其他模块是 可用,提供更直接和一致 接口。特别值得推荐的是XML::LibXML XML::Twig是一个很好的选择。
此模块的主要问题是大量选项 (其中一些有不幸的默认值)和任意方式 这些选项相互作用 - 通常会产生意想不到的结果。
修补程序包含错误修复和文档修复程序,但是很新 功能不太可能被添加。
鉴于该陈述的清晰度,我无法理解为什么有人仍然会使用该模块进行新的开发。
您的代码中应始终包含use strict
和use warnings
。第一个将强制您声明变量(使用my
)。如果您避免使用new Class
语法并使用Class->new
,那么您未来的维护程序员将会感谢您。
鉴于所有这些事情(好吧,除了我没有替换XML :: Simple),你的代码看起来像这样:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
my $xml = XML::Simple->new;
my $data = $xml->XMLin('data.xml', KeyAttr => 'ns1');
print Dumper $data;
print $data->{repairStationId};
此代码对我有效(但是,原始代码也是如此)。