perl XML ::简单的打印问题

时间:2017-11-29 10:04:00

标签: perl

这是我的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"};

1 个答案:

答案 0 :(得分:3)

当我在我的机器上尝试时,您的代码可以正常工作。当然,因为你发布了你的代码图片,而不是将其作为文本发布(我不知道为什么人们认为这很有用 - 你只是讨厌那些你要求帮助你的人!),我不得不重新键入你的代码,我可能“意外”修复了导致你问题的错误 - 我怀疑你试图打印的密钥大写不匹配。

了解您正在使用的XML :: Simple版本也会有所帮助。您可能正在遇到更新版本中已修复的错误。

值得指出一些事情。首先,XML::Simple的文档包含以下文字:

  

此模块的状态

     

不鼓励在新代码中使用此模块。其他模块是   可用,提供更直接和一致   接口。特别值得推荐的是XML::LibXML   XML::Twig是一个很好的选择。

     

此模块的主要问题是大量选项   (其中一些有不幸的默认值)和任意方式   这些选项相互作用 - 通常会产生意想不到的结果。

     

修补程序包含错误修复和文档修复程序,但是很新   功能不太可能被添加。

鉴于该陈述的清晰度,我无法理解为什么有人仍然会使用该模块进行新的开发。

您的代码中应始终包含use strictuse 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};

此代码对我有效(但是,原始代码也是如此)。