C# 使用XSLT获取旧XML中的修改,然后将它们应用到新XML中
我认为我的问题很一般,可以问这个问题,但也很具体,所以还没有人问——或者我没能找到它 任务如下:应用程序的配置存储在XML文档中。此后,应用程序不断发展,当前配置存储在不同的XML中。新的XML在结构上也不同,因此简单地复制旧的配置将破坏应用程序。 我们的目标很简单:我们希望将配置更改从旧的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进行比较。
- 如果未修改节点,则向前移动
- 如果删除了节点,则将其xpath位置复制到删除的节点集合
- 如果添加了节点,则将其xpath位置和内容移动到添加的节点集合中
- 如果修改了节点,请将修改的原子内容/属性移动到“修改的节点”集合
- 如果某个节点不是原子节点,则将上述算法应用于每个子节点。(递归算法)
- 打开新的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一无所知。我熟悉XML,对XSD有一些基本的了解。这似乎不是需要或保证通过XSLT实现自动化的地方。这种情况多久发生一次?一天一次?一个月?为了多少东西?一份申请?100000份申请?有非常好的Diff/Exmaine/Hand Merge工具,包括那些内置在工具中的工具,如氧气或触控笔,似乎就足够了。@KevinBrown可能看起来就够了,但它没有。此解决方案将是从版本1升级到版本2过程的一部分。当时间到来时,从版本2到版本3等等。我不坚持使用XSLT,我只想应用差异。如果你有更好的方法,我洗耳恭听。好吧,如果你有上面的“xml差异”文件,应用这些更改可能最适合代码,而不是XSL。也就是说,使用源代码控制来管理“源代码”,并让它处理它。。。“不要重新发明轮子。”凯文布朗坦率地说,我不明白你在说什么。什么是源代码控制?我的主要问题是:如何使用xslt从未修改和修改的文件中获取xml dif文件,或者其他一些可编程的方法。如果您没有以任何“受控”的方式管理更改,那么应用更改可能不是一个自动化的过程——或者我们可能没有;I don’我没有所有的信息——例如:您已经“修改了旧XML”——它们可能是不同的人提供的任何信息吗?一些人删除了一些东西,一些人把它移到了最后,一些人改变了结构。