我使用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总是给我两个元素每个差异在我的名单?证实这一点将允许我通过排除每个差异的第二个元素来继续工作,但显然除非它总是存在,否则我不能这么做。
你使用了什么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
你如何填充'expectedNodes'和'actualNodes'? XML文档中的文本被表示为“XText”,它也是“XNode”。我怀疑你没有过滤出来。 – 2013-02-11 15:20:11
编辑原始帖子来回答你的问题。 – 2013-02-11 15:34:26