2013-02-11 46 views
1

我使用LINQ来比较两个XML文档。如果两个元素之间存在差异,我将这些节点添加到我用来生成差异报告的列表中。LINQ&XNode.DeepEquals两次运行比较?

'问题'是,如果找到差异,它将被添加到列表两次。

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

预计:

<Parsed_Data> 
    <IntentCount>0</IntentCount> 
    . 
    . 
    . 
</Parsed_Data> 

实际:

<Parsed_Data> 
    <IntentCount>1</IntentCount> 
    . 
    . 
    . 
</Parsed_Data> 

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

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

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两个元素:

expectedNode: "<IntentCount>1</IntentCount>" 
actualNode: "<IntentCount>0</IntentCount>" 

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

似乎DeepEquals先比较元素,然后值。我的问题是,我的代码中是否有可能导致重复的内容,或者这是DeepEquals的一个功能,我无能为力?

我已经运行测试,看看这是否总是发生,似乎是这种情况。所以后续问题将是:我可以依靠XNode.DeepEquals总是给我两个元素每个差异在我的名单?证实这一点将允许我通过排除每个差异的第二个元素来继续工作,但显然除非它总是存在,否则我不能这么做。

+0

你使用了什么Node类/类型?你能提供一个链接到它的api文档吗?我能找到的所有[node as a cluster](http://msdn.microsoft.com/en-us/library/microsoft.computecluster.node%28v=vs.85%29.aspx)。 – 2013-02-11 15:16:05

+0

你如何填充'expectedNodes'和'actualNodes'? XML文档中的文本被表示为“XText”,它也是“XNode”。我怀疑你没有过滤出来。 – 2013-02-11 15:20:11

+0

编辑原始帖子来回答你的问题。 – 2013-02-11 15:34:26

回答

1

XML文档中的文本显示为XText(这是一个XNode)。通过遍历后代节点,您正在浏览元素和文本。您可能应该浏览没有子元素的元素。

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(); 
+0

谢谢,这完全回答了我的问题。你的回答也让我更好地理解了LINQ。 – 2013-02-12 16:55:54