我需要“合并”两个XML文档,覆盖重叠的属性和元素。例如,如果我有 document1 :
<mapping>
<key value="assigned">
<a/>
</key>
<whatever attribute="x">
<k/>
<j/>
</whatever>
</mapping>
和 document2 :
<mapping>
<key value="identity">
<a/>
<b/>
</key>
</mapping>
我想合并这两个:
<mapping>
<key value="identity">
<a/>
<b/>
</key>
<whatever attribute="x">
<k/>
<j/>
</whatever>
</mapping>
我更喜欢基于 Java 或 XSLT 的解决方案, ant 会很好,但如果在 Rake , Ruby 或 Python 请不要害羞: - )
编辑:实际上我发现我宁愿使用自动工具/脚本,甚至是writing it by myself,因为手动合并30个XML文件有点笨拙...... :-(
答案 0 :(得分:6)
如果您喜欢XSLT,那么我之前使用的是一个很好的合并脚本: Oliver's XSLT page
答案 1 :(得分:3)
我知道这是一个旧帖子,但Project: Merge可以为你做这个。它可以将两个XML文件合并在一起,并且可以从命令行运行,因此您可以将所有内容一起批处理,运行它并只需手动解决任何冲突(例如上面示例中“key”的属性值更改)点击几下。 (如果没有冲突,你可以告诉它静默运行。)
它可以执行XML文件的双向和三向比较以及双向和三向合并。 (如果三向操作假定被比较/合并的两个文件具有共同的祖先。)
答案 2 :(得分:2)
检查XmlCombiner这是一个以这种方式实现XML合并的Java库。它基于plexus-utils库提供的类似功能。
XmlCombiner默认约定是覆盖重叠的属性和元素。但是可以使用特殊的'combine.self' and 'combine.children'属性来改变确切的合并行为。
用法:
import org.atteo.xmlcombiner.XmlCombiner;
// create combiner
XmlCombiner combiner = new XmlCombiner();
// combine files
combiner.combine(firstFile);
combiner.combine(secondFile);
// store the result
combiner.buildDocument(resultFile);
免责声明:我是作者。
答案 3 :(得分:1)
(也使用Oliver's XSLT stlyesheets)
来自PowerShell的XSLT合并:
param(
[Parameter(Mandatory = $True)][string]$file1,
[Parameter(Mandatory = $True)][string]$file2,
[Parameter(Mandatory = $True)][string]$path
)
# using only abs paths .. just to be safe
$file1 = Join-Path $(Get-Location) $file1
$file2 = Join-Path $(Get-Location) $file2
$path = Join-Path $(Get-Location) $path
# awesome xsl stylesheet from Oliver Becker
# http://web.archive.org/web/20160502194427/http://www2.informatik.hu-berlin.de/~obecker/XSLT/merge/merge.xslt
$xsltfile = Join-Path $(Get-Location) "merge.xslt"
$XsltSettings = New-Object System.Xml.Xsl.XsltSettings
$XsltSettings.EnableDocumentFunction = 1
$xslt = New-Object System.Xml.Xsl.XslCompiledTransform;
$xslt.Load($xsltfile , $XsltSettings, $(New-Object System.Xml.XmlUrlResolver))
[System.Xml.Xsl.XsltArgumentList]$al = [System.Xml.Xsl.XsltArgumentList]::new()
$al.AddParam("with", "", $file2)
$al.AddParam("replace", "", "true")
[System.Xml.XmlWriter]$xmlwriter = [System.Xml.XmlWriter]::Create($path)
$xslt.Transform($file1, $al, $xmlwriter)
使用&#39;普通ol&#39;撒克逊:
java -jar saxon9he.jar .\FileA.xml .\merge.xslt with=FileB.xml replace=true
答案 4 :(得分:0)
不确定是否要以编程方式执行此操作。
编辑:啊,我在编辑之前发布了。我现在看起来不像个白痴! ;)
如果您只想将两个文件合并在一起,那么IBM会有一个XML Diff and Merge Tool,而且还有Altova的DiffDog。