使用XML::Twig使用Perl解析XML

使用XML::Twig使用Perl解析XML,perl,xml-twig,Perl,Xml Twig,我需要从一个XML文件中获取一些值…该文件位于多个站点。。例如:,等等。。XML文件的格式为: <?xml version="1.0"?> <gateway> <version>Kannel bearerbox version `1.4.3' </version> <status>running, uptime 0d 14h 19m 49s</status> <wdp> <received><t

我需要从一个XML文件中获取一些值…该文件位于多个站点。。例如:,等等。。XML文件的格式为:

<?xml version="1.0"?>
<gateway>
<version>Kannel bearerbox version `1.4.3' </version>
<status>running, uptime 0d 14h 19m 49s</status>
<wdp>
<received><total>0</total><queued>0</queued></received>
<sent><total>0</total><queued>0</queued></sent>
</wdp>
<sms>
<received><total>50569</total><queued>0</queued></received>
<sent><total>38</total><queued>0</queued></sent>
<storesize>-1</storesize>
<inbound>1.53,1.52,0.98</inbound>
<outbound>0.00,0.00,0.00</outbound>
</sms>
<smscs><count>5</count>
<smsc>
<name>SMPP:1.2.3.4:3802/3802:hng123:HNDSMPP</name>
<id>hng123</id>
<status>online 51589s</status>
<received>0</received>
<sent>0</sent>
<failed>0</failed>
<queued>0</queued>
</smsc>
<smsc>
<name>SMPP:1.2.3.4:3757/3757:vashn:HNDSMPP</name>
<id>vas1</id>
<status>online 51589s</status>
<received>40872</received>
<sent>32</sent>
<failed>0</failed>
<queued>0</queued>
</smsc>
</smscs>
</gateway>
但是,当运行脚本时,我在开始时得到了一些空字段。。。还有一个警告。。。每个服务器中的每个xml文件。。。。 这是输出。。。为什么?…我不需要它们。。。只需要与XML相关的字段

miId.String.id = Tabla_
stringProp.String = 
idProp = 
Use of uninitialized value $status_gral[0] in concatenation (.) or string at ./v25.pl line 32.
status_idObs.StringObservation.obs = 
recvTotal.Metric = 
sentTotal.Metric = 
queuedTotal.Metric = 
faildTotal.Metric = 
miId.String.id = Tabla_hng123
stringProp.String = SMPP:1.2.3.4:3802/3802:hng123:HNDSMPP
idProp = hng123
status_idObs.StringObservation.obs = online
recvTotal.Metric = 0
sentTotal.Metric = 66173
queuedTotal.Metric = 0
faildTotal.Metric = 0 
miId.String.id = Tabla_vas1
stringProp.String = SMPP:1.2.3.4:3757/3757:vashn:HNDSMPP
idProp = vas1
status_idObs.StringObservation.obs = online
recvTotal.Metric = 0
sentTotal.Metric = 45492
queuedTotal.Metric = 0
faildTotal.Metric = 0
Use of uninitialized value $status_gral[0] in concatenation (.) or string at ./v25.pl line 32.
status_idObs.StringObservation.obs = 
recvTotal.Metric = 
sentTotal.Metric = 
queuedTotal.Metric = 
faildTotal.Metric = 
miId.String.id = Tabla_hng123
stringProp.String = SMPP:1.2.3.4:3802/3802:hng123:HNDSMPP
idProp = hng123
status_idObs.StringObservation.obs = online
recvTotal.Metric = 0
sentTotal.Metric = 0
queuedTotal.Metric = 0
faildTotal.Metric = 0
miId.String.id = Tabla_vas1
stringProp.String = SMPP:1.2.3.4:3757/3757:vashn:HNDSMPP
idProp = vas1
status_idObs.StringObservation.obs = online 
recvTotal.Metric = 40872
sentTotal.Metric = 32
queuedTotal.Metric = 0
faildTotal.Metric = 0
非常感谢你的帮助


Michael。

未初始化值的原因是因为
smscs
中的第一个子项实际上是
count

<smscs>
    <count>5</count>
    <smsc>
        <name>SMPP:1.2.3.4:3802/3802:hng123:HNDSMPP</name>
        <id>hng123</id>
        <status>online 51589s</status>
        <received>0</received>
        <sent>0</sent>
        <failed>0</failed>
        <queued>0</queued>
    </smsc>
    <smsc>
        <name>SMPP:1.2.3.4:3757/3757:vashn:HNDSMPP</name>
        <id>vas1</id>
        <status>online 51589s</status>
        <received>40872</received>
        <sent>32</sent>
        <failed>0</failed>
        <queued>0</queued>
    </smsc>
</smscs>

根据我的经验,
$elt->children()
(或者
first\u child
,或者任何导航方法)几乎总是一个bug。您应该通过使用条件来限制导航,除非您有非常非常好的理由不这样做(并且您在下面的代码中测试了您访问的元素)。@mirod您建议使用
子项进行导航的替代方法是什么?@stevenl您使用的替代方法:
$root->children('smsc'))
;--)使用标记名或其他特征指定您想要的孩子类型,通常情况下您不会有问题。
<smscs>
    <count>5</count>
    <smsc>
        <name>SMPP:1.2.3.4:3802/3802:hng123:HNDSMPP</name>
        <id>hng123</id>
        <status>online 51589s</status>
        <received>0</received>
        <sent>0</sent>
        <failed>0</failed>
        <queued>0</queued>
    </smsc>
    <smsc>
        <name>SMPP:1.2.3.4:3757/3757:vashn:HNDSMPP</name>
        <id>vas1</id>
        <status>online 51589s</status>
        <received>40872</received>
        <sent>32</sent>
        <failed>0</failed>
        <queued>0</queued>
    </smsc>
</smscs>
foreach my $connection ($root->children('smsc')) {
    ...
}