Как сравнить два XML-файла и добавить недостающие элементы, используя c # - PullRequest
2 голосов
/ 07 декабря 2009

Иногда один или несколько элементов XML отсутствуют в файле XML. Прямо сейчас, я думаю, что одна из работ - сравнить XML-файл с основным XML-файлом (имеющим все элементы) и, если какой-либо элемент отсутствует, добавить этот элемент в XML-файл из основного файла.

Как мне достичь этой или любой другой лучшей идеи?

Ответы [ 3 ]

1 голос
/ 07 декабря 2009

Одной из самых крутых библиотек, которые я нашел, просто осматривая сайт Microsoft, является библиотека XmlDiffPatch. Вы можете найти дополнительную информацию по http://msdn.microsoft.com/en-us/library/aa302294.aspx, но, по сути, она позволяет сравнить два документа, найти все различия и затем применить эти различия. Очень полезно для сжатия XML-файлов для отправки по сети

0 голосов
/ 25 апреля 2014

В моем примере узлом верхнего уровня является <content>, поэтому вам просто нужно заменить его на любой другой узел верхнего уровня в вашем XML-файле.

public static void MergeMissingContentFileNodes(string sourceFile, string destFile)
{
    string topLevelNode = "content";

    XmlDocument srcXml = new XmlDocument();
    srcXml.Load(sourceFile);

    XmlDocument destXml = new XmlDocument();
    destXml.Load(destFile);

    XmlNode srcContentNode = srcXml.SelectSingleNode(topLevelNode);
    destXml = LoopThroughAndCreateMissingNodes(destXml, srcContentNode, topLevelNode);
    destXml.Save(destFile);

}

public static XmlDocument LoopThroughAndCreateMissingNodes(XmlDocument destXml, XmlNode parentNode, string parentPath)
{
    foreach (XmlNode node in parentNode.ChildNodes) 
    {
        //check if node exists and update destXML
        if (node.NodeType == XmlNodeType.Element) 
        {
            string currentPath = string.Format("{0}/{1}", parentPath, node.Name);
            if (destXml.SelectSingleNode(currentPath) == null) 
            {
                dynamic destParentNode = destXml.SelectSingleNode(parentPath);
                destParentNode.AppendChild(destParentNode.OwnerDocument.ImportNode(node, true));
            }

            LoopThroughAndCreateMissingNodes(destXml, node, currentPath);

        }
    }

    return destXml;
}
0 голосов
/ 07 декабря 2009

С текст ссылки

using System.Xml;

public class Form1
{

XmlDocument Doc1;
XmlDocument Doc2;

string Doc1Path = "C:\\XmlDoc1.xml";

private void Form1_Load(object sender, System.EventArgs e)
{

    Doc1 = new XmlDocument();
    Doc2 = new XmlDocument();

    Doc1.Load(Doc1Path);
    Doc2.Load("C:\\XmlDoc2.xml");

    Compare();

    Doc1.Save(Doc1Path);

}

public void Compare()
{

    foreach (XmlNode ChNode in Doc2.ChildNodes) {
        CompareLower(ChNode);
    }

}

public void CompareLower(XmlNode NodeName)
{

    foreach (XmlNode ChlNode in NodeName.ChildNodes) {

        if (ChlNode.Name == "#text") {
            continue;
        }

        string Path = CreatePath(ChlNode);

        if (Doc1.SelectNodes(Path).Count == 0) {
            XmlNode TempNode = Doc1.ImportNode(ChlNode, true);
            Doc1.SelectSingleNode(Path.Substring(0, Path.LastIndexOf("/"))).AppendChild(TempNode);
            Doc1.Save(Doc1Path);
        }
        else {
            CompareLower(ChlNode);
            Doc1.Save(Doc1Path);
        }

    }

}

public string CreatePath(XmlNode Node)
{

    string Path = "/" + Node.Name;

    while (!(Node.ParentNode.Name == "#document")) {
        Path = "/" + Node.ParentNode.Name + Path;
        Node = Node.ParentNode;
    }
    Path = "/" + Path;
    return Path;

}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...