我正在使用LINQ来比较两个XML文档。如果在两个元素之间发现差异,我将这些节点添加到用于生成差异报告的列表中。
'问题'是如果发现差异,则会将其添加到列表中两次。
例如,给定两个简单的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 :(得分: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();