我有兩個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