【发布时间】:2011-01-04 02:37:39
【问题描述】:
我正在尝试编写一个简单的算法来读取两个具有完全相同节点和结构的 XML 文件,但子节点内的数据不一定相同且顺序不同。如何使用 Microsoft 的 XML Diff .DLL 创建一个简单的实现来创建第三个临时 XML 作为前两个 XML 之间的差异?
MSDN 上的 XML 差异:
要比较的两个不同 XML 文件的示例 XML 代码:
<?xml version="1.0" encoding="utf-8" ?>
<Stats Date="2011-01-01">
<Player Rank="1">
<Name>Sidney Crosby</Name>
<Team>PIT</Team>
<Pos>C</Pos>
<GP>39</GP>
<G>32</G>
<A>33</A>
<PlusMinus>20</PlusMinus>
<PIM>29</PIM>
</Player>
</Stats>
<?xml version="1.0" encoding="utf-8" ?>
<Stats Date="2011-01-10">
<Player Rank="1">
<Name>Sidney Crosby</Name>
<Team>PIT</Team>
<Pos>C</Pos>
<GP>42</GP>
<G>35</G>
<A>34</A>
<PlusMinus>22</PlusMinus>
<PIM>30</PIM>
</Player>
</Stats>
想要的结果(两者之间的差异)
<?xml version="1.0" encoding="utf-8" ?>
<Stats Date="2011-01-10">
<Player Rank="1">
<Name>Sidney Crosby</Name>
<Team>PIT</Team>
<Pos>C</Pos>
<GP>3</GP>
<G>3</G>
<A>1</A>
<PlusMinus>2</PlusMinus>
<PIM>1</PIM>
</Player>
</Stats>
在这种情况下,我可能会使用 XSLT 将生成的 XML“差异”文件转换为已排序的 HTML 文件,但我还没有做到。我要做的就是在第三个 XML 文件中显示每个节点的每个数值的差异,从“GP”子节点开始。
我目前拥有的 C# 代码:
private void CompareXml(string file1, string file2)
{
XmlReader reader1 = XmlReader.Create(new StringReader(file1));
XmlReader reader2 = XmlReader.Create(new StringReader(file2));
string diffFile = StatsFile.XmlDiffFilename;
StringBuilder differenceStringBuilder = new StringBuilder();
FileStream fs = new FileStream(diffFile, FileMode.Create);
XmlWriter diffGramWriter = XmlWriter.Create(fs);
XmlDiff xmldiff = new XmlDiff(XmlDiffOptions.IgnoreChildOrder |
XmlDiffOptions.IgnoreNamespaces |
XmlDiffOptions.IgnorePrefixes);
bool bIdentical = xmldiff.Compare(file1, file2, false, diffGramWriter);
diffGramWriter.Close();
// cleaning up after we are done with the xml diff file
File.Delete(diffFile);
}
这就是我到目前为止所拥有的,但结果是垃圾......请注意,对于每个“播放器”节点,前三个子节点都有 NOT 进行比较......我该如何实现这个?
【问题讨论】:
-
好问题,+1。请参阅我对两种解决方案的回答:一种使用辅助 XSLT 转换来创建两个仅包含应比较元素的新 XML 文档,另一种解决方案完全是 XSLT。 :)