我使用perl的XML :: LibXML模塊來解析來自設備的XML響應。 看來,我可以成功獲取數據的唯一方法是通過修改設備的XML響應。 下面是從設備我的XML響應:使用perl XML :: LibXML來解析
<chassis-inventory xmlns="http://xml.juniper.net/junos/10.3D0/junos-chassis">
<chassis junosstyle="inventory">
<name>Chassis</name>
<serial-number>JN111863EAFF</serial-number>
<description>VJX1000</description>
<chassis-module>
<name>Midplane</name>
</chassis-module>
<chassis-module>
<name>System IO</name>
</chassis-module>
<chassis-module>
<name>Routing Engine</name>
<description>VJX1000</description>
<chassis-re-disk-module>
<name>ad0</name>
<disk-size>1953</disk-size>
<model>QEMU HARDDISK</model>
<serial-number>QM00001</serial-number>
<description>Hard Disk</description>
</chassis-re-disk-module>
</chassis-module>
<chassis-module>
<name>FPC 0</name>
<chassis-sub-module>
<name>PIC 0</name>
</chassis-sub-module>
</chassis-module>
<chassis-module>
<name>Power Supply 0</name>
</chassis-module>
</chassis>
</chassis-inventory>
這裏是我使用的解析,找到例如序列號的Perl代碼:
#!/bin/env perl
use strict;
use warnings;
use XML::LibXML;
my $f = ("/var/working/xmlstuff");
sub yeah {
my $ff;
my $f = shift;
open(my $fff,$f);
while(<$fff>) {
$_ =~ s/^\s+$//;
$_ =~ s/^(<\S+)\s.*?=.*?((?:\/)?>)/$1$2/g;
$ff .= $_;
}
close($fff);
return $ff
}
my $tparse = XML::LibXML->new();
my $ss = $tparse->load_xml(string => &yeah($f));
print map $_->to_literal,$ss->findnodes('/chassis-inventory/chassis/serial-number');
如果我不使用正則表達式替換沒有爲腳本加載解析。 我能理解換行符的剝離,但爲什麼我必須刪除從XML響應的屬性,所以它只能出現這些線條:
<chassis-inventory xmlns="http://xml.juniper.net/junos/10.3D0/junos-chassis">
<chassis junosstyle="inventory">
成爲這樣的:
<chassis-inventory>
<chassis>
這是XML響應還是XML :: LibXML模塊的問題?
有沒有辦法讓它忽略文件中沒有使用正則表達式替換的空行的事實?
感謝您的幫助。
我相信這可能會失敗,因爲您的XML缺少正確的標頭和文檔類型。也就是說,這看起來很簡單,你可以嘗試使用XML :: Simple,即使XML不是100%正確的,也可以設置爲解析。 – Cfreak