首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ & XNode.DeepEquals运行两次比较?

LINQ & XNode.DeepEquals运行两次比较?
EN

Stack Overflow用户
提问于 2013-02-11 15:03:08
回答 1查看 781关注 0票数 1

我使用LINQ来比较两个XML文档。如果两个元素之间存在差异,则将这些节点添加到列表中,用于生成差异报告。

问题是,如果发现了差异,就会将其两次添加到列表中。

例如,给定两个简单的XML文档:

预期:

代码语言:javascript
复制
<Parsed_Data>
  <IntentCount>0</IntentCount>
  .
  .
  .
</Parsed_Data>

实数:

代码语言:javascript
复制
<Parsed_Data>
  <IntentCount>1</IntentCount>
  .
  .
  .
</Parsed_Data>

,并使用此代码比较节点并将它们添加到列表中,如果它们不同:

Node类包含两个XNodes,一个用于预期,一个用于实际。

代码语言:javascript
复制
var expectedNodesRoot = from desc in expected.Descendants("root") 
                        select desc;

var actualNodesRoot = from desc in actual.Descendants("root")
                                select desc;

IEnumerable<XNode> expectedNodes =
               from node in expectedNodesRoot.Elements("Parsed_Data").DescendantNodes()
                select node;

IEnumerable<XNode> actualNodes =
                from node in actualNodesRoot.Elements("Parsed_Data").DescendantNodes()
                select node;

 List<Node> diffList = new List<Node>();
 IEnumerator e = expectedNodes.GetEnumerator();
 IEnumerator a = actualNodes.GetEnumerator();

 while (e.MoveNext() && a.MoveNext())
 {
   var xe = e.Current as XNode;
   var xa = a.Current as XNode;

   if (!XNode.DeepEquals(xe, xa))
   {
     diffList.Add(new Node(xe, xa));
   }
 }

的一个不同之处是,这给了我diffList中的两个元素:

代码语言:javascript
复制
expectedNode: "<IntentCount>1</IntentCount>"
actualNode: "<IntentCount>0</IntentCount>"

expectedNode = "{1}"
actualNode = "{0}"

DeepEquals似乎首先比较元素,然后比较值。我的问题是,我的代码中是否有任何可能导致重复的东西,或者这是否是DeepEquals的一个我不能做的特性?

我已经运行了测试,看看这种情况是否总是发生,而且似乎是这样的。因此,接下来的问题是:我是否可以指望XNode.DeepEquals总是在我的列表中给出两个元素?确认这一点将允许我通过排除每个差异的第二个元素来继续工作,但显然,除非它始终存在,否则我不能这样做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-11 17:15:51

XML文档中的文本以XText (即XNode)的形式公开。通过遍历子代节点,您将遍历元素和文本。您可能应该使用没有子元素的元素。

代码语言:javascript
复制
var expectedElements = expected.Descendants("root")
    .Elements("Parsed_Data")
    .Descendants()
    .Where(d => !d.HasElements);
var actualElements = actual.Descendants("root")
    .Elements("Parsed_Data")
    .Descendants()
    .Where(d => !d.HasElements);
var diffList = expectedElements.Zip(actualElements, (e, a) => new Node(e, a))
    .Where(n => !XNode.DeepEquals(n.Expected, n.Actual))
    .ToList();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14814759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档