c# - 比较 2 个 XML 文档并将更改应用到源文档

标签 c# xml xslt merge

这是我的问题。我有 2 个具有相同结构的 xml 文件,与第一个相比,第二个 xml 只包含几个节点。

文件1

  <root>
    <alpha>111</alpha>
    <beta>22</beta>
    <gamma></gamma>
    <delta></delta>
  </root>

文件2

 <root>
    <beta>XX</beta>
    <delta>XX</delta>
 </root>

结果应该是这样的

 <root>
    <alpha>111</alpha>
    <beta>22</beta>
    <gamma></gamma>
    <delta>XX</delta>
 </root>

基本上,如果 File1 中任何节点的节点内容为空,那么它应该从 File2 中读取值(如果存在,即)。

我确实尝试了 Microsoft XmlDiff API 的运气,但它对我没有用(补丁过程没有应用对源文档的更改)。另外我有点担心它使用的 DOM 方法,因为我将要处理的 xml 的大小。 你能建议一个这样做的好方法吗? 我正在使用 C# 2

最佳答案

这是 Alastair 提出的更简单、更有效的解决方案(请参阅我对他的解决方案的评论)。

这个转换:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:variable name="vFile2"
         select="document('File2.xml')"/>

    <xsl:template match="*">
      <xsl:copy>
        <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[not(text())]">
      <xsl:copy>
        <xsl:copy-of
          select="$vFile2/*/*[name() = name(current())]/text()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

应用于此 XML 文档时:

<root>
    <alpha>111</alpha>
    <beta>22</beta>
    <gamma></gamma>
    <delta></delta>
</root>

产生想要的结果:

<root>
    <alpha>111</alpha>
    <beta>22</beta>
    <gamma></gamma>
    <delta>XX</delta>
</root>

关于c# - 比较 2 个 XML 文档并将更改应用到源文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/326960/

相关文章:

c# - 依赖注入(inject)容器?它有什么作用?

c - 将 XML 数据导入 Access 时出现问题

android - 可以从特定的 div 生成 XML 文件吗?

css - xslt 中的样式标签未呈现

c# - 单元测试服务层和 Entity Framework 6

c# - 在这种情况下如何使用异常?

c# - 测试对象是否为 IEnumerable 的最快方法是什么?

xml - 使用一张表选择 XML 循环节点 (sqL)

sorting - 使用 XSLT 排序时忽略 'A' 和 'The'

xml - 有没有办法在 schematron 中传递变量?