比较两个XML文件并在C#中使用XMLDiff生成第三个文件

比较两个XML文件并在C#中使用XMLDiff生成第三个文件,第1张

比较两个XML文件并在C#中使用XMLDiff生成第三个文件

有两种直接的解决方案:

解决方法1。

您可以首先对两个文档应用简单的转换,这将删除不应比较的元素。然后,将两个文档的结果与您当前的代码完全比较。这是转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node()|@*">  <xsl:copy>   <xsl:apply-templates select="node()|@*"/>  </xsl:copy> </xsl:template> <xsl:template match="Name|Team|Pos"/></xsl:stylesheet>

当此转换应用于提供的XML文档时:

<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>        <PP>10</PP>        <SH>1</SH>        <GW>3</GW>        <Shots>0</Shots>        <ShotPctg>154</ShotPctg>        <TOIPerGame>20.8</TOIPerGame>        <ShiftsPerGame>21:54</ShiftsPerGame>        <FOWinPctg>22.6</FOWinPctg>    </Player></Stats>

生成所需的结果文件:

<Stats Date="2011-01-01">   <Player Rank="1">      <GP>39</GP>      <G>32</G>      <A>33</A>      <PlusMinus>20</PlusMinus>      <PIM>29</PIM>      <PP>10</PP>      <SH>1</SH>      <GW>3</GW>      <Shots>0</Shots>      <ShotPctg>154</ShotPctg>      <TOIPerGame>20.8</TOIPerGame>      <ShiftsPerGame>21:54</ShiftsPerGame>      <FOWinPctg>22.6</FOWinPctg>   </Player></Stats>

解决方案2。

这是一个完整的XSLT 1.0解决方案(仅出于方便起见,第二个XML文档已嵌入转换代码中):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:variable name="vrtfDoc2">  <Stats Date="2011-01-01">    <Player Rank="2">        <Name>John Smith</Name>        <Team>NY</Team>        <Pos>D</Pos>        <GP>38</GP>        <G>32</G>        <A>33</A>        <PlusMinus>15</PlusMinus>        <PIM>29</PIM>        <PP>10</PP>        <SH>1</SH>        <GW>4</GW>        <Shots>0</Shots>        <ShotPctg>158</ShotPctg>        <TOIPerGame>20.8</TOIPerGame>        <ShiftsPerGame>21:54</ShiftsPerGame>        <FOWinPctg>22.6</FOWinPctg>    </Player>  </Stats> </xsl:variable> <xsl:variable name="vDoc2" select=  "document('')*[name()=name(current())])">   <xsl:call-template name="identity"/>  </xsl:if> </xsl:template> <xsl:template match="Name|Team|Pos" priority="20"/></xsl:stylesheet>

当将此变换应用于与上述相同的第一个文档时,将生成正确的衍射图:

<Stats Date="2011-01-01">   <Player Rank="1">      <GP>39</GP>      <PlusMinus>20</PlusMinus>      <GW>3</GW>      <ShotPctg>154</ShotPctg>   </Player></Stats>  -----------------------  <Stats xmlns:xsl="http://www.w3.org/1999/XSL/Transform" Date="2011-01-01">   <Player Rank="2">      <GP>38</GP>      <PlusMinus>15</PlusMinus>      <GW>4</GW>      <ShotPctg>158</ShotPctg>   </Player></Stats>

运作方式:

  1. 将该转换应用于第一个文档,并将第二个文档作为参数传递。

  2. 这将生成一个XML文档,其唯一的叶子元素节点的值与第二个文档中相应的叶子元素节点的值不同。

  3. 执行与上面1.中相同的处理,但是这次在第二个文档上,将第一个文档作为参数传递。

  4. 这将产生第二个差异图:一个XML文档,其唯一的叶子元素节点的值**与第一个文档中相应的叶子元素节点的值不同



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4895875.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存