[英]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.