我使用perl的XML :: LibXML模块来解析来自设备的XML响应.看来我能成功获取数据的唯一方法是修改设备的XML响应.这是我对设备的XML响应:
<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>
Run Code Online (Sandbox Code Playgroud)
这是我用来解析和查找序列号的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');
Run Code Online (Sandbox Code Playgroud)
如果我不使用正则表达式替换,则不会加载任何脚本来解析.我可以理解剥离换行符,但为什么我必须从XML响应中删除属性,所以它只适用于以下行:
<chassis-inventory xmlns="http://xml.juniper.net/junos/10.3D0/junos-chassis">
<chassis junosstyle="inventory">
Run Code Online (Sandbox Code Playgroud)
成为这个:
<chassis-inventory>
<chassis>
Run Code Online (Sandbox Code Playgroud)
这是XML响应还是XML :: LibXML模块的问题?
有没有办法让它忽略文件中没有使用正则表达式替换的空行这一事实?
谢谢您的帮助.
Joe*_*oel 12
XPATH表达式失败的原因是命名空间; 你需要在上下文中搜索.以下是XML :: libXML文档的解释:
关于NAMESPACES和XPATH的注意事项:
关于XPath的一个常见错误是假设节点测试由一个没有前缀的元素名称与默认命名空间中的元素匹配.这种假设是错误的 - 通过XPath规范,此类节点测试只能匹配no(即null)命名空间中的元素.
因此,例如,一个人不能将XHTML文档的根元素与$ node-> find('/ html')匹配,因为'/ html'只会匹配,如果根元素没有命名空间,但所有XHTML元素都属于名称空间http://www.w3.org/1999/xhtml.(注意,xmlns ="..."命名空间声明也可以在DTD中指定,这使情况更糟,因为XML文档看起来好像没有默认命名空间).
要处理此问题,请注册命名空间,然后使用命名空间搜索文档.这是一个适合您的示例:
#!/bin/env perl
use strict;
use warnings;
use XML::LibXML;
my $xml = XML::LibXML->load_xml( location => '/var/working/xmlstuff');
my $xpc = XML::LibXML::XPathContext->new($xml);
$xpc->registerNs('x', 'http://xml.juniper.net/junos/10.3D0/junos-chassis');
foreach my $node ($xpc->findnodes('/x:chassis-inventory/x:chassis/x:serial-number')) {
print $node->textContent() . "\n";
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4149 次 |
最近记录: |