我有两个 xml 。需要读取这两个并创建仅包含不同元素的新 xml
专家您好, 我对这个东西有点陌生,我想知道如何使用 C#/xmlunit2.0 比较两个 xml 文件并仅显示另一个 xml 文件 与 xml 文件中的差异:
xml1:
<ORDERS>
<ORDER>
<ORDERNUM>979793524</ORDERNUM>
<TIES>
<TIE>
<TIENUMBER>1</TIENUMBER>
<ITEMS>
<ITEM>
<ITEMNUMBER>KF3P2</ITEMNUMBER>
<ITEMQTY>1</ITEMQTY>
</ITEM>
<ITEM>
<ITEMNUMBER>60RD2</ITEMNUMBER>
<ITEMQTY>1</ITEMQTY>
</ITEM>
</ITEMS>
</TIE>
</TIES>
</ORDER>
</ORDERS>
XML2:
<ORDERS>
<ORDER>
<ORDERNUM>979793524</ORDERNUM>
<TIES>
<TIE>
<TIENUMBER>1</TIENUMBER>
<ITEMS>
<ITEM>
<ITEMNUMBER>60RD2</ITEMNUMBER>
<ITEMQTY>1</ITEMQTY>
</ITEM>
<ITEM>
<ITEMNUMBER>KF3P2</ITEMNUMBER>
<ITEMQTY>25</ITEMQTY>
</ITEM>
</ITEMS>
</TIE>
</TIES>
</ORDER>
</ORDERS>
Expected Output:
<ORDERNUM>979793524</ORDERNUM>
<ITEMNUMBER>KF3P2</ITEMNUMBER>
<ITEMQTY>25</ITEMQTY>
最佳答案
这是一项具有挑战性的任务,并且没有通用(即与词汇无关)的解决方案,部分原因是只有您知道数据中什么重要,什么不重要 - 例如,在这种情况下,ITEM 元素的顺序似乎无关紧要(其中如果您比较两篇期刊文章,情况就不会如此)。不将一个文档中存在 TIEQTY 和另一个文档中不存在 TIEQTY 视为显着差异,以及在结果中包含 ORDERNUM 但不包含 TIENUMBER,可能有一些原因。
解决这个问题的一种方法是:
(a) 将数据扁平化到特定级别,例如 ITEM,因此 ITEM 容器的重要属性(例如 ORDERNUM)成为 ITEM 的属性。
(b) 对于每个项目,计算一个字符串形式的区别签名,这样两个项目如果不同,则具有不同的签名。
(c) 使用分组按签名对两个文件中的项目进行分组。
(d) 输出(某些表示形式)组大小为 1 的那些 ITEMS。
这一切都可以通过 XSLT 2.0 方便地完成,或者使用 xsl:merge
效果更好。在 XSLT 3.0 中。
关于xml - 使用 xslt/c# 比较两个 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52453627/