2013-02-11 80 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