我有两个XML文件。在第一个我有一些设备已经在数据库(标签ipAddress是重要的)。 第二个XML文件包含那些应该添加的设备/设备,如果它们不在数据库(发布请求)。要比较xml文件中具有相同名称的标签与其他xml文件中的其他标签
我已经有了比较两个XML文件的代码,如果他们只有一个设备(一个标签与ipAddress)。
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? – Sobrique
另外 - 第一个'文件'似乎是两个单独的XML文档。这是故意的吗? – Sobrique
不,它不应该是两个单独的XML文档,是一个错误 – StayCalm