我有两个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>
答案 0 :(得分:2)
这是一项艰巨的任务,没有通用的(即与词汇无关的)解决方案,部分原因是因为只有您知道数据中的重要内容和不重要的内容-例如,在这种情况下,ITEM元素的顺序似乎无关紧要(如果您要比较两个期刊文章,则不会是这种情况。可能有一些原因没有在一个文档中考虑TIEQTY的存在,而在另一个文档中不存在TIEQTY,这是因为要包含ORDERNUM而不是TIENUMBER。
一种解决方法是:
(a)将数据展平到特定级别,例如ITEM,因此ITEM容器的重要属性(例如ORDERNUM)成为ITEM的属性。
(b)对于每个ITEM,将一个可区分的签名计算为字符串,以使两个不同的项具有不同的签名。
(c)使用分组通过签名将两个文件中的ITEM分组。
(d)输出(某些表示)组大小为1的那些ITEMS。
使用XSLT 2.0可以方便地完成所有操作,或者甚至可以在XSLT 3.0中使用xsl:merge
来完成此操作。