簡體   English   中英

XML使用LINQ to XML比較元素和值

[英]XML compare Elements and Values using LINQ to XML

    XElement client = new XElement("Root",
        new XElement("Child2", "2"),
        new XElement("Child1", "1"),
        new XElement("Child3", "hello world"),
        new XElement("Child5", "5")
        );

    XElement server = new XElement("Root",
        new XElement("Child1", "1"),
        new XElement("Child2", "2"),
        new XElement("Child3", "3"),
        new XElement("Child4", "4")
    );

什么是正確的LINQ to XML來比較這兩個XML並得到客戶端:
a)元素Child4缺失
b)元素Child5存在但在服務器上丟失
c)元素Child3與服務器相比具有不同的值

是否有一種簡單的方法可以使用LINQ to XML獲得那些3個“delta”節點?

====================================
到目前為止我嘗試了什么:
1)XmlDiff

        var clientNode = XElement.Parse(client.ToString()).CreateReader();
        var serverNode = XElement.Parse(server.ToString()).CreateReader();
        var resultNode = new XDocument();
        var writer = resultNode.CreateWriter();

        var diff = new XmlDiff(XmlDiffOptions.IgnoreChildOrder | XmlDiffOptions.IgnoreWhitespace | XmlDiffOptions.IgnoreComments | XmlDiffOptions.IgnoreDtd | XmlDiffOptions.IgnorePrefixes | XmlDiffOptions.IgnoreXmlDecl);
        diff.Compare(clientNode, serverNode, writer);
        writer.Flush();
        writer.Close();
        resultNode.ToString();

...但它給了我一些復雜的XML,我將不得不解碼。

2)將其轉換為字符串並進行比較

        string c = client.ToString().Trim();
        string s = server.ToString().Trim();
        c = c.Replace("Root", "").Replace("</", "").Replace("<", "").Replace(">", "");
        s = s.Replace("Root", "").Replace("</", "").Replace("<", "").Replace(">", "");

        List<string> c1 = c.Split(new[] { "\r\n" }, StringSplitOptions.None).ToList<string>();
        List<string> s1 = s.Split(new[] { "\r\n" }, StringSplitOptions.None).ToList<string>();

        List<string> delta1 = s1.Except(c1).ToList();
        List<string> delta2 = c1.Except(s1).ToList();

......但它給了我不可讀的文字。

============================================
所以我希望通過LINQ to XML,我們可以快速獲得delta元素的列表,可能帶有一個標簽,說明返回元素“x”所在的XML。

查找元素名稱差異很容易:

var clientElementNames = client.Elements().Select(x => x.Name);
var serverElementNames = server.Elements().Select(x => x.Name);

var clientOnly = clientElementNames.Except(serverElementNames);
var serverOnly = serverElementNames.Except(clientElementNames);

對於具有不同值的元素,我可能會進行連接:

var differences = from clientElement in client.Elements()
                  join serverElement in server.Elements()
                    on clientElement.Name equals serverElement.Name
                  where clientElement.Value != serverElement.Value
                  select new { Name = clientElement.Name,
                               ClientValue = clientElement.Value,
                               ServerValue = serverElement.Value };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM