这是我的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>
我使用关注代码打印"起诉类型"one_answers"名称",但是它无法打印它们,代码如下:
# 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"};
当我在计算机上尝试时,您的代码可以工作。当然,因为您发布了代码的图片,而不是将其发布为文本(我不知道为什么人们认为这很有用 - 您只是在烦恼您要帮助您的人!)键入您的代码,我有可能"不小心"修复任何错误引起您的问题的问题 - 我怀疑您试图打印的密钥的大写不匹配。
这也将有助于知道您正在使用哪个版本的XML :: Simple。您可能正在与已在最近版本中固定的错误进行奔跑。
值得指出一些事情。首先,XML ::简单包含此文本的文档:
此模块的状态
不建议在新代码中使用此模块。其他模块是 可用可提供更直接和一致的 接口。特别是,强烈建议使用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};
此代码对我的预期工作(但是,您的原始代码也是如此)。