C# 使用XSLT获取旧XML中的修改,然后将它们应用到新XML中

C# 使用XSLT获取旧XML中的修改,然后将它们应用到新XML中,c#,xml,xslt,C#,Xml,Xslt,我认为我的问题很一般,可以问这个问题,但也很具体,所以还没有人问——或者我没能找到它 任务如下:应用程序的配置存储在XML文档中。此后,应用程序不断发展,当前配置存储在不同的XML中。新的XML在结构上也不同,因此简单地复制旧的配置将破坏应用程序。 我们的目标很简单:我们希望将配置更改从旧的XML文档转移到新的XML文档中。我们可以访问: 未修改的旧XML 修改旧XML 未修改的新XML 根据上面的信息,我必须创建新的XML文档,在其中重新应用旧XML中的修改 我已经想出了算法,但我不想在这

我认为我的问题很一般,可以问这个问题,但也很具体,所以还没有人问——或者我没能找到它

任务如下:应用程序的配置存储在XML文档中。此后,应用程序不断发展,当前配置存储在不同的XML中。新的XML在结构上也不同,因此简单地复制旧的配置将破坏应用程序。 我们的目标很简单:我们希望将配置更改从旧的XML文档转移到新的XML文档中。我们可以访问:

  • 未修改的旧XML
  • 修改旧XML
  • 未修改的新XML
根据上面的信息,我必须创建新的XML文档,在其中重新应用旧XML中的修改

我已经想出了算法,但我不想在这里重新发明轮子。高级算法如下所示:

  • 将未修改的XML中的每个节点与修改后的XML进行比较。
    • 如果未修改节点,则向前移动
    • 如果删除了节点,则将其xpath位置复制到删除的节点集合
    • 如果添加了节点,则将其xpath位置和内容移动到添加的节点集合中
    • 如果修改了节点,请将修改的原子内容/属性移动到“修改的节点”集合
    • 如果某个节点不是原子节点,则将上述算法应用于每个子节点。(递归算法)
  • 打开新的XML,转到每个修改位置,然后
    • 删除删除的节点
    • 添加添加的节点
    • 应用修改
收集的修改的xml布局如下所示:

<xml-diff>
    <added-node location="/xpath/to/the/node">
        <content-of-the-added-node with="attributes">
            <and-sub-elements-as-well/>
        </content-of-the-added-node>
    </added-node>
    <removed-node location="/xpath/to/the/node"/>
    <modified-node location="/xpath/to/the/node">
        <content-of-the-modified-node>modified-atomic-content</content-of-the-modified-node>
    </modified-node>
    <added-attribute location="/xpath/to/the/@attribute">value</added-attribute>
    <removed-attribute location="/xpath/to/the/@attribute" />
    <modified-attribute location="/xpath/to/the/@attribute">new-value</added-attribute>        
</xml-diff>

改性原子含量
价值
新价值
添加的节点的内容和修改的节点的内容都是修改后的旧xml中的节点

在找到旧xml中的修改之后,任务非常简单。我可以在新xml中重新应用xpath不变的修改。我还有一个映射,它描述了旧的xpath值被更改为新的xpath值,从而正确地应用了配置更改。(例如/root/node1已移动到/root/collections/node1等)

我知道XSLT用于将一种XML转换为另一种XML。这里棘手的部分是检测修改是什么——转换是什么。不幸的是,处理XML有点棘手,因为节点的顺序并不总是保持不变,但它仍然意味着同样的事情

我的问题是:

  • XSLT是解决这个问题的正确途径,还是应该使用其他方法
  • 如果XSLT是,那么递归检测这些更改的正确转换算法是什么
  • 如果XSLT不是答案,那么答案是什么
  • 您能为我提供一个简单的XSLT,我可以从这里开始工作吗

  • 请注意,我对XSLT一无所知。我熟悉XML,对XSD有一些基本的了解。

    这似乎不是需要或保证通过XSLT实现自动化的地方。这种情况多久发生一次?一天一次?一个月?为了多少东西?一份申请?100000份申请?有非常好的Diff/Exmaine/Hand Merge工具,包括那些内置在工具中的工具,如氧气或触控笔,似乎就足够了。@KevinBrown可能看起来就够了,但它没有。此解决方案将是从版本1升级到版本2过程的一部分。当时间到来时,从版本2到版本3等等。我不坚持使用XSLT,我只想应用差异。如果你有更好的方法,我洗耳恭听。好吧,如果你有上面的“xml差异”文件,应用这些更改可能最适合代码,而不是XSL。也就是说,使用源代码控制来管理“源代码”,并让它处理它。。。“不要重新发明轮子。”凯文布朗坦率地说,我不明白你在说什么。什么是源代码控制?我的主要问题是:如何使用xslt从未修改和修改的文件中获取xml dif文件,或者其他一些可编程的方法。如果您没有以任何“受控”的方式管理更改,那么应用更改可能不是一个自动化的过程——或者我们可能没有;I don’我没有所有的信息——例如:您已经“修改了旧XML”——它们可能是不同的人提供的任何信息吗?一些人删除了一些东西,一些人把它移到了最后,一些人改变了结构。