1

LINQを使用して2つのXMLドキュメントを比較しています。2つの要素の間に違いが見つかった場合は、それらのノードをリストに追加し、違いのレポートを生成するために使用します。

「問題」は、違いが見つかった場合、それがリストに2回追加されることです。

たとえば、2つの単純なXMLドキュメントがあるとします。

期待される:

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

実際:

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

そして、このコードを使用してノードを比較し、ノードが異なる場合はリストに追加します。

Nodeクラスには、2つのXNodeが含まれています。1つは期待値用で、もう1つは実際用です。

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));
   }
 }

1つの違いとして、これによりdiffListに2つの要素が与えられます。

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

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

DeepEqualsは最初に要素を比較し、次に値を比較しているようです。私の質問は、重複を引き起こしている可能性のあるコードに何かありますか、それともこれは私が何もできないDeepEqualsの機能ですか?

私はこれが常に起こるかどうかを確認するためにテストを実行しました、そしてそれは事実であるようです。したがって、フォローアップの質問は次のようになります。XNode.DeepEqualsを使用して、リストの違いごとに常に2つの要素を取得できますか?これを確認することで、違いごとに2番目の要素を除外して作業を続行できますが、常に存在しない限り、明らかにそれを行うことはできません。

4

1 に答える 1

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();
于 2013-02-11T17:15:51.320 に答える