使用xslt / c#比较两个xml文件

时间:2018-09-22 04:59:34

标签: xml xslt xslt-1.0 xslt-2.0

我有两个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>

1 个答案:

答案 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来完成此操作。