2008-09-17 21 views
19

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

<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 basado en luciones, hormiga harán muy bien, pero si hay una manera fácil de hacer que en Rake, Rubí o Python favor no seas tímido :-)

EDIT: De hecho, me encuentro Prefiero usar una herramienta/script automatizado, incluso writing it by myself, porque la fusión manual de unos 30 archivos XML es un poco difícil de manejar ... :-(

+0

¿Puede ser un poco más específico acerca de las reglas que desee ¿Aplicar? ¿Siempre habrá solo un elemento con el mismo nombre? ¿Se profundiza en el árbol para comparar elementos secundarios cuando ambos documentos tienen el mismo elemento (con atributos idénticos)? –

+0

Por cierto, su ejemplo no está bien formado ("lo que sea" no está cerrado). –

Respuesta

6

Si te gusta XSLT, hay una secuencia de comandos de combinación agradable que he usado antes en: Oliver's XSLT page

+1

El enlace está muerto. – stm

+1

Gracias por señalar @stm - Lo he reemplazado con el enlace archive.org a esa página –

-1

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

Editar: Ah, publiqué eso antes del Editar. ¡No me veo como un idiota ahora! ;)

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

+0

No importa, he sido un poco torpe y publiqué la pregunta antes de que el texto estuviera completo ... ¿quién se ve como un idiota, ahora? ;-) En cuanto a su respuesta: muchas gracias, estoy investigando las herramientas que sugirió y le dejaré saber si salvó mi ... tocino :-) –

+3

el enlace a XML Diff and Merge Tool de IBM no ya funciona – chobok

3

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

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

0

Compruebe XmlCombiner que es una biblioteca de Java que implementa la combinación XML exactamente de esta manera. Está basado libremente en una funcionalidad similar ofrecida por la biblioteca plexus-utils.

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

responsabilidad: yo soy el autor.

0

(también usando Oliver's XSLT stlyesheets)

XSLT Combinar desde 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) 

El uso de 'ol llano' sajona:

java -jar saxon9he.jar .\FileA.xml .\merge.xslt with=FileB.xml replace=true 
Cuestiones relacionadas