合并XML文档

时间:2008-09-17 06:50:02

标签: xml

我需要“合并”两个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文件有点笨拙...... :-(

5 个答案:

答案 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