Vergleichen Sie zwei XML-Dateien und speichern Sie Unterschiede zu einer Ergebnis-Datei

Ich habe zwei XML-Dateien, die ich brauche, um zu vergleichen, um Unterschiede, die XML ist sehr einfach:

Datei 1:

<?xml version="1.0" encoding="utf-8"?>
<Feeds zone="my zone">
  <Feed name="attribDump.json">ac1f07edc491a3d237cdfb1a17fc4551</Feed>
  <Feed name="focus_GroupsKV.txt">0f9e0a14a4ffce6ff5065b6e088c1f84</Feed>
  <Feed name="NAM_FORMATTED.csv">9e875496cdb072b5e54318d51295fdba</Feed>
  <Feed name="BNP\activityTitles.txt">2d27c0f19b71b4b411bcb00011d3f8b0</Feed>
</Feeds>

- und Datei 2:

<?xml version="1.0" encoding="utf-8"?>
<FeedsRequest version="1">
<Feeds zone="my zone">
  <Feed name="attribDump.json">ac1f07edc491a3d237cdfb1a17fc4551</Feed>
  <Feed name="focus_GroupsKV.txt">0f9e0a14a4ffce6ff5065b6e088c1f84</Feed>
  <Feed name="BNP\activityTitles.txt">e54c5b851ee3ff3f43b10d24f2316431</Feed>
</Feeds>
</FeedsRequest>

Datei 1 ist eine Inventur-Liste der Dateien auf unseren file share und Datei 2 ist durch ein getrenntes Gerät, das aktualisiert werden müssen aus Datei 1. Die Prüfungen muss ich machen, sind 1) stellen Sie sicher, dass alle feeds in der Datei 1 in Datei 2 und 2) stellen Sie sicher, dass alle feeds, die gefunden werden, haben den gleichen hashCode(die lange Zeichenfolge). Sobald die Prüfungen abgeschlossen sind, brauche ich zum erstellen einer Antwort-Datei, die eine Liste aller feeds und dann ein Attribut für jedes eine, die bestimmt ok (Datei wurde gefunden und gematcht), fehlen (Datei nicht gefunden), oder aktualisiert ("Datei wurde gefunden, aber es war eine ältere version).

Also im Grunde die Ergebnis-Datei würde wie folgt Aussehen:

<?xml version="1.0" encoding="utf-8"?>
<FeedsResponse version="1">
<Feeds zone="my zone">
  <Feed name="attribDump.json" status="ok">ac1f07edc491a3d237cdfb1a17fc4551</Feed>
  <Feed name="focus_GroupsKV.txt" status="ok">0f9e0a14a4ffce6ff5065b6e088c1f84</Feed>
  <Feed name="NAM_FORMATTED.csv" status="missing">afd2c620053ed4f85ab02b4cc5f7a2b2</Feed>
  <Feed name="BNP\activityTitles.txt" status="updated">90805b851ee3ff3f43b10d24f2316431</Feed>

Was ich mache zurzeit ist die Schleife durch alle Dateien in Datei 1, dann überprüfen Sie Sie gegen Datei 2 für die Unterschiede. Wo ich stecken geblieben bin, schon eine Weile, seit ich habe mit XML gearbeitet, ist, wie zu bauen das Antwort-Dokument.

            FileInfo feedList = new FileInfo(_feedList);
        FileInfo feedRequest = new FileInfo(_feedRequest);

        //Load the documents
        XmlDocument feedListXmlDoc = new XmlDocument();
        feedListXmlDoc.Load(_feedList);

        //Load the documents
        XmlDocument feedRequestXmlDoc = new XmlDocument();
        feedRequestXmlDoc.Load(_feedRequest);

        //create response doc
        XmlDocument feedResponseXmlDoc = new XmlDocument();

        //Define a single node
        XmlNode feedListNode;
        XmlNode feedRequestNode;

        //Get the root Xml element
        XmlElement feedListRoot = feedListXmlDoc.DocumentElement;
        XmlElement feedRequestRoot = feedRequestXmlDoc.DocumentElement;

        //Get a list of all player names
        XmlNodeList feedListXml = feedListRoot.GetElementsByTagName("Feed");
        XmlNodeList feedRequestXml = feedRequestRoot.GetElementsByTagName("Feed");

        //Create an XmlWriterSettings object with the correct options. 
        XmlWriter writer = null;
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.IndentChars = ("  ");
        settings.OmitXmlDeclaration = false;

        //Create the XmlWriter object and write some content.
        writer = XmlWriter.Create(_resultPath, settings);
        writer.WriteStartElement("FeedsDiff");

        //The compare algorithm
        bool feedMatch = false;

        int j = 0;

        try 
        {
            //loop through list of current feeds
            for (int i = 0; i < feedListXml.Count; i++)
            {
                feedListNode = feedListXml.Item(i);

                string feedListName = feedListNode.Attributes["name"].Value.ToString();
                string feedListHash = feedListXml.Item(i).InnerText.ToString();

                //check feed request list for a match
                while (j < feedRequestXml.Count && feedMatch == false)
                {
                    feedRequestNode = feedRequestXml.Item(j);
                    string feedRequestName = feedRequestNode.Attributes["name"].Value.ToString();

                    //checks to see if feed names match
                    if (feedListName == feedRequestName)
                    {
                        feedMatch = true;
                        string feedRequestHash = feedRequestXml.Item(j).InnerText.ToString();

                        //since we found the node, we can remove it from the request list
                        XmlNode node = feedRequestNode.ParentNode;
                        node.RemoveChild(feedRequestNode);

                        //checks to see if hash codes match
                        if (feedListHash == feedRequestHash)
                        {
                            //if name and code match, move to the next one
                            feedMatch = true;

                            //add 'status="ok"' attribute to the node
                            //feedResponseXmlDoc.ImportNode(feedRequestNode,false);

                            Debug.WriteLine(feedListName + " name and hash match");

                            j = 0;
                        }
                        else 
                        {

                            feedMatch = true;

                            //feed has been updated since last device sync
                            //need to add status='update' attribute and append file to response
                            Debug.WriteLine(feedListName + " name matched but hash did not");
                        }
                    }
                    else
                    {
                        //names didn't match
                        //add status="missing" to the node
                        j++;
                    }
                }
                feedMatch = false;
            }
            //end Xml document
            writer.WriteEndElement();
            writer.Flush();
        }
        finally
        {
            if (writer != null)
                writer.Close();
        }

Momentan bin ich zu instanziieren versucht, die Antwort doc, bevor die Schleife und dann fügen Sie einfach die Elemente, wie Sie gefunden, aber ich habe eine harte Zeit der Suche nach einem prägnanten Weg, es zu tun. Jede Hilfe ist willkommen.

  • können Sie Ihre code, der die relevant für die Frage, die du gepostet hast..?
  • Hinzugefügt werden, wie angefordert. Ich weiß, es ist ein bisschen Dünn in der Schleife, das ist, wo ich stecken geblieben bin.
Schreibe einen Kommentar