我使用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