ti-enxame.com

Mesclar documentos XML

Eu preciso "mesclar" dois documentos XML, substituindo os atributos e elementos sobrepostos. Por exemplo, se eu tiver document1:

<mapping>
    <key value="assigned">
        <a/>
    </key>
    <whatever attribute="x">
        <k/>
        <j/>
    </whatever>
</mapping>

e document2:

<mapping>
    <key value="identity">
        <a/>
        <b/>
    </key>
</mapping>

Eu quero mesclar os dois assim:

<mapping>
    <key value="identity">
        <a/>
        <b/>
    </key>
    <whatever attribute="x">
        <k/>
        <j/>
    </whatever>
</mapping>

Eu prefiro Java ou [~ # ~] xslt [~ # ~] - soluções baseadas, - ant funcionará bem , mas se houver uma maneira fácil de fazer isso em Rake, Ruby ou Python por favor, não seja tímido: -)

EDIT: na verdade, acho que prefiro usar uma ferramenta/script automatizado, até escrevendo por mim mesmo , porque mesclar manualmente cerca de 30 arquivos XML é um pouco complicado. .. :-(

22
Manrico Corazzi

Se você gosta de XSLT, há um script de mesclagem agradável que já usei em: página XSLT de Oliver

7
Craig.Nicol

Marque XmlCombiner , que é uma biblioteca Java que implementa a mesclagem XML exatamente dessa maneira. É vagamente baseada em uma funcionalidade semelhante oferecida por plexus-utils biblioteca.

A convenção padrão do XmlCombiner é substituir os atributos e elementos sobrepostos. Mas o comportamento exato da mesclagem pode ser alterado usando atributos especiais 'combine.self' e 'combine.children' .

Uso:

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);

Disclaimer: Eu sou o autor.

4
Sławek

Eu sei que este é um thread antigo, mas Projeto: Mesclar pode fazer isso por você. Ele pode mesclar dois arquivos XML e pode ser executado a partir da linha de comando, para que você possa agrupar tudo, executá-lo e resolver apenas quaisquer conflitos (como a alteração do valor do atributo 'chave' no exemplo acima) manualmente com alguns cliques. (Você pode dizer para executar silenciosamente, desde que não haja conflitos.)

Ele pode realizar comparações bidirecionais e triplas de arquivos XML e mesclagens bidirecionais e triplas. (Onde uma operação tripartida assume que os dois arquivos que estão sendo comparados/mesclados têm um ancestral comum.)

4
user420442

Não tenho certeza se você deseja fazer isso programaticamente ou não.

Edit: Ah, eu postei isso antes do Edit. Não pareço um idiota agora! ;)

Se você apenas deseja mesclar dois arquivos, a IBM possui um XML Diff and Merge Tool , e também há DiffDog do Altova.

1
moobaa

(também usando folhas de estilo XSLT de Oliver )

Mesclagem XSLT do PowerShell:

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)

Usando o saxão 'plain ol':

Java -jar saxon9he.jar .\FileA.xml .\merge.xslt with=FileB.xml replace=true
1
mwallner