【发布时间】:2017-03-17 13:15:05
【问题描述】:
我有两个 XML 文件。在第一个中,我有一些设备已经在数据库中(标签 ipAddress 很重要)。 第二个 XML 文件包含设备/设备,如果它们不在数据库中,则应添加它们(发布请求)。
如果两个 XML 文件只有一个设备(一个带有 ipAddress 的标签),我已经编写了比较两个 XML 文件的代码。
FILE1(包含 30 个设备。例如,我只添加了 2 个)。
<?xml version="1.0" ?>
<queryResponse last="34" first="0" count="35" type="Devices" responseType="listEntityInstances" requestUrl="https://hostname/webacs/api/v1/data/Devices?.full=true" rootUrl="https://hostname/webacs/api/v1/data">
<entity dtoType="devicesDTO" type="Devices" url="https://hostname/webacs/api/v1/data/Devices/200">
<devicesDTO displayName="201200" id="200">
<deviceName>NEW</deviceName>
<deviceType>Cisco Switch</deviceType>
<ipAddress>10.66.12.128</ipAddress>
</devicesDTO>
</entity>
<entity dtoType="devicesDTO" type="Devices" url="https://hostname/webacs/api/v1/data/Devices/201">
<devicesDTO displayName="201201" id="201">
<deviceName>NEW-SWW</deviceName>
<deviceType>Cisco Switch</deviceType>
<ipAddress>10.66.12.127</ipAddress>
</devicesDTO>
</entity>
</queryResponse>
FILE2(可以是一个或多个设备)
<?xml version="1.0"?>
<devicesImport>
<devices>
<device>
<ipAddress>10.66.0.8</ipAddress>
<networkMask>24</networkMask>
<snmpWriteCommunity>labor</snmpWriteCommunity>
<udfs>
<udf>
<name>LaborTest</name>
</udf>
</udfs>
</device>
</devices>
</devicesImport>
<devicesImport>
<devices>
<device>
<ipAddress>10.66.0.9</ipAddress>
<networkMask>24</networkMask>
<snmpWriteCommunity>labor</snmpWriteCommunity>
<udfs>
<udf>
<name>LaborTest</name>
</udf>
</udfs>
</devices>
</devices>
</devicesImport>
我的代码:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $xml1 = XML::Twig->new->parsefile('FILE1.xml');
my $xml2 = XML::Twig->new->parsefile('FILE2.xml');
#$xml2->findnodes( './ipAddress/*'); # I tried to cover all ipAddress from FILE1
#Next Try to do it other way
#foreach $xml1->get_xpath( '//ipAddress', 0 )->text {
#foreach $xml2->get_xpath( '//ipAddress', 0 )->text {
# I compare here just one tag from both files (it works if my file contains just one device)
if ( $xml1->get_xpath( '//ipAddress', 0 )->text
eq $xml2->get_xpath( '//ipAddress', 0 )->text )
{
print "IP matches\n";
}
我也试过了
if (( $xml1->get_xpath( '//ipAddress', 0 )->text
eq $xml2->get_xpath( '//ipAddress', 0 )->text )
for $xml2->findnodes ('//ipAddress'));
但它不起作用。
【问题讨论】:
-
您列表中的这些条目是否真的相关?它们没有相同的名称或 IP?
-
另外 - 第一个“文件”似乎是两个单独的 XML 文档。这是故意的吗?
-
不,它不应该是两个独立的 XML 文档,是一个错误
-
是的,它们没有相同的名称或 IP,这只是示例......但此时它只是 IP,因为我的“file2”只包含 IP 而没有名称
标签: xml perl xml-parsing