it-swarm-es.tech

Combinar documentos XML

Necesito "fusionar" dos documentos XML, sobrescribiendo los atributos y elementos superpuestos. Por ejemplo, si tengo document1 :

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

y documento2 :

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

Quiero fusionar los dos así:

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

Prefiero Java o [~ # ~] xslt [~ # ~] basadas en soluciones, ant funcionará bien, pero si hay una manera fácil de hacerlo en Rake , Ruby o Python por favor no ' t ser tímido :-)

EDITAR: en realidad encuentro que prefiero usar una herramienta/script automatizado, incluso escribirlo yo mismo , porque fusionar manualmente unos 30 archivos XML son un poco difíciles de manejar ... :-(

22
Manrico Corazzi

Si te gusta XSLT, hay una secuencia de comandos de fusión agradable que he usado antes en: página XSLT de Oliver

7
Craig.Nicol

Sé que este es un hilo antiguo, pero Project: Merge puede hacer esto por usted. Puede fusionar dos archivos XML, y puede ejecutarse desde la línea de comandos, por lo que puede agrupar todo, ejecutarlo y simplemente resolver cualquier conflicto (como el cambio del valor de atributo de 'clave' en su ejemplo anterior) manualmente con unos pocos clics (Puede decirle que se ejecute en silencio siempre que no haya conflictos).

Puede realizar comparaciones bidireccionales y tridireccionales de archivos XML y fusiones bidireccionales y tridireccionales. (Cuando una operación de tres vías supone que los dos archivos que se comparan/fusionan tienen un ancestro común).

4
user420442

Verifique XmlCombiner que es una biblioteca Java que implementa la fusión de XML exactamente de esta manera. Se basa libremente en una funcionalidad similar ofrecida por plexus-utils biblioteca.

La convención predeterminada de XmlCombiner es sobrescribir los atributos y elementos superpuestos. Pero el comportamiento exacto de fusión se puede alterar usando atributos especiales 'combine.self' y '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);

Descargo de responsabilidad: soy el autor.

3
Sławek

No está seguro de si desea hacer esto programáticamente o no.

Editar: Ah, publiqué eso antes de la Edición. ¡No me veo como un idiota ahora! ;)

Si solo desea fusionar dos archivos juntos, IBM tiene un XML Diff y Merge Tool , y también está Altova's DiffDog .

1
moobaa

(también usando hojas de estilo XSLT de Oliver )

Combinación XSLT de 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 el sajón 'simple':

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