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

标签 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>

最佳答案

这是一项具有挑战性的任务,并且没有通用(即与​​词汇无关)的解决方案,部分原因是只有您知道数据中什么重要,什么不重要 - 例如,在这种情况下,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/

相关文章:

xml - xslt中如何获取同一节点下的最大值

html - XQuery://vs descendant-or-self::node()

c# - 将新的 XElement 添加到现有的 XElement(如果它不存在)

c++ - Qt中如何编辑XML文档的结尾(writeEndDocument)?

java - 如何强制 javax xslt 转换器使用 utf-8 而不是 html 实体对国家字符进行编码?

xslt - XSLT:测试节点是否存在,无论它是当前节点的子代还是子代

php - 如何将字符串与 Xpath 1.0 进行比较?

javascript - XML文档显示

xslt - XSLT在同一路径上添加元素

xml - 在 xml 层次结构中向上移动分隔符元素