2016-05-09 9 views
0

Ich schreibe einen C# -Code mit der Absicht, regelmäßig eine XML-Datei herunterzuladen, den resultierenden XML-Code mit einer zuvor heruntergeladenen Version von XML zu vergleichen (Änderungen zu erkennen) und dann die Änderungen zu "bearbeiten" CRUD-Anweisungen), indem Datenbankdatensätze aktualisiert werden, die die Entitäten in der XML widerspiegeln.XML für Unterschiede vergleichen

Ich brauche Hilfe mit dem "Vergleich der resultierenden XML mit einer zuvor heruntergeladenen Version , um Änderungen zu erkennen" Teil der Anforderungen.

So ... die folgenden zwei XML-Dokumenten unter Berücksichtigung der geringen Unterschiede haben ...

Original-

<ROOT> 
    <Stock> 
     <Vehicle id="2574074"> 
     <DealerName>Super Cars London</DealerName> 
     <FriendlyName>Ford Ranger 3.2 double cab 4x4 XLT auto</FriendlyName> 
     <ModelName>Ranger</ModelName> 
     <MakeName>Ford</MakeName> 
     <Registration>DG55TPG</Registration> 
     <Price>40990</Price> 
     <Colour>WHITE</Colour> 
     <Year>2014</Year> 
     <Mileage>52000</Mileage> 
     <Images> 
      <Image Id="4771304" ThumbUrl="http://www.somewhere.com/GetImage.aspx?ImageId=4771304&amp;Type=6&amp;Width=60&amp;Height=60&amp;FeedId=42" FullUrl="http://www.somewhere.com/GetImage.aspx?ImageId=4771304&amp;Type=6&amp;Width=640&amp;FeedId=42" LastModified="2016-02-02T08:24:51.48" Priority="1"/> 
     </Images> 
     </Vehicle> 
     <Vehicle id="2648665"> 
     <DealerName>Super Cars London</DealerName> 
     <FriendlyName>BMW 320i</FriendlyName> 
     <ModelName>3 Series</ModelName> 
     <MakeName>BMW</MakeName> 
     <Registration>CN03YZG</Registration> 
     <Price>24990</Price> 
     <Colour>WHITE</Colour> 
     <Year>2013</Year> 
     <Mileage>96000</Mileage> 
     <Images/> 
     </Vehicle> 
    </Stock> 
</ROOT> 

New

<ROOT> 
    <Stock> 
     <Vehicle id="2575124"> 
     <DealerName>Supercars London</DealerName> 
     <FriendlyName>Ford Ranger 3.2 double cab 4x4 XLT auto</FriendlyName> 
     <ModelName>Ranger</ModelName> 
     <MakeName>Ford</MakeName> 
     <Registration>DK08FKP</Registration> 
     <Price>43990</Price> 
     <Colour>WHITE</Colour> 
     <Year>2014</Year> 
     <Mileage>30000</Mileage> 
     <Images> 
      <Image Id="5119812" ThumbUrl="http://www.somewhere.com/GetImage.aspx?ImageId=5119812&amp;Type=6&amp;Width=60&amp;Height=60&amp;FeedId=42" FullUrl="http://www.somewhere.com/GetImage.aspx?ImageId=5119812&amp;Type=6&amp;Width=640&amp;FeedId=42" LastModified="2016-04-11T13:08:42.81" Priority="1"/> 
     </Images> 
     </Vehicle> 
     <Vehicle id="2648665"> 
     <DealerName>Super Cars London</DealerName> 
     <FriendlyName>BMW 320i</FriendlyName> 
     <ModelName>3 Series</ModelName> 
     <MakeName>BMW</MakeName> 
     <Registration>CN03YZG</Registration> 
     <Price>24990</Price> 
     <Colour>BRILLIANT WHITE</Colour> 
     <Year>2013</Year> 
     <Mileage>96000</Mileage> 
     <Images> 
      <Image Id="5201856" ThumbUrl="http://www.somewhere.com/GetImage.aspx?ImageId=5201856&amp;Type=6&amp;Width=60&amp;Height=60&amp;FeedId=42" FullUrl="http://www.somewhere.com/GetImage.aspx?ImageId=5201856&amp;Type=6&amp;Width=640&amp;FeedId=42" LastModified="2016-04-25T12:12:05.827" Priority="1"/> 
      <Image Id="5201857" ThumbUrl="http://www.somewhere.com/GetImage.aspx?ImageId=5201857&amp;Type=6&amp;Width=60&amp;Height=60&amp;FeedId=42" FullUrl="http://www.somewhere.com/GetImage.aspx?ImageId=5201857&amp;Type=6&amp;Width=640&amp;FeedId=42" LastModified="2016-04-25T12:12:09.117" Priority="2"/> 
      <Image Id="5201858" ThumbUrl="http://www.somewhere.com/GetImage.aspx?ImageId=5201858&amp;Type=6&amp;Width=60&amp;Height=60&amp;FeedId=42" FullUrl="http://www.somewhere.com/GetImage.aspx?ImageId=5201858&amp;Type=6&amp;Width=640&amp;FeedId=42" LastModified="2016-04-25T12:12:13.59" Priority="3"/> 
      <Image Id="5201859" ThumbUrl="http://www.somewhere.com/GetImage.aspx?ImageId=5201859&amp;Type=6&amp;Width=60&amp;Height=60&amp;FeedId=42" FullUrl="http://www.somewhere.com/GetImage.aspx?ImageId=5201859&amp;Type=6&amp;Width=640&amp;FeedId=42" LastModified="2016-04-25T12:12:18.453" Priority="4"/> 
      <Image Id="5201860" ThumbUrl="http://www.somewhere.com/GetImage.aspx?ImageId=5201860&amp;Type=6&amp;Width=60&amp;Height=60&amp;FeedId=42" FullUrl="http://www.somewhere.com/GetImage.aspx?ImageId=5201860&amp;Type=6&amp;Width=640&amp;FeedId=42" LastModified="2016-04-25T12:12:22.853" Priority="5"/> 
     </Images> 
     </Vehicle> 
    </Stock> 
</ROOT> 

Zusammenfassung der Unterschiede

  1. Fahrzeug id="2575124" ist nicht im Original vorhanden. Dies stellt ein "create" dar.
  2. Fahrzeug id="2574074" ist nicht in der neuen vorhanden. Dies stellt ein "Löschen" dar.
  3. Das Fahrzeug id="2648665" (das sowohl im Original als auch neu vorhanden ist) hat einen anderen <Colour> (WHITE -> BRILLIANT WHITE). Dies stellt ein "Update" dar.
  4. Fahrzeug id="2648665" hat auch neue <Image> Knoten in der neuen. Dies stellt ein "create" dar (als Bilder werden 1: M mit dem Fahrzeug in der Datenbank sein).

Ich habe bei XMLDiff sah einen DiffGram mit Add/Wechsel zu erzeugen/entfernen Anweisungen, aber ich kann nicht einen Weg finden, um es ein DiffGram zu machen zu erzeugen, die die Veränderungen darstellen I zusammengefasst habe, zum Beispiel es sieht die Änderungen 1 und 2 als "Änderung" - <xd:change match="@id">2648665</xd:change> - anstelle der Abwesenheit und Hinzufügung eines Fahrzeugs.

Gibt es eine Möglichkeit, dies mit XMLDiff zu tun?

Oder gibt es einen "besseren" Weg, um das Ergebnis zu erreichen, das ich suche?

Antwort

0

ich gefunden habe, dass LINQ für Unterschiede eine ziemlich gute Arbeit der Parsen der XML tun können, z ...

XDocument xNewVehicle = new XDocument(new XElement("UsedStock", 
        from newVehicle in newXml.Descendants("Vehicle") 
        join oldVehicle in oldXml.Descendants("Vehicle") 
         on newVehicle.Attributes("id").First().Value equals oldVehicle.Attributes("id").First().Value into oldVehicles 
        where !oldVehicles.Any() // where the vehicle exists in new but not in old 
         || newVehicle.ToString() != oldVehicles.First().ToString() // where the new vehicle is not the same as the old vehicle 
       select newVehicle)); 
Verwandte Themen