gpathresult xml groovy xml-parsing markupbuilder

gpathresult - Groovy: copia elementos XML de un documento a otro



xml-parsing markupbuilder (1)

Soy nuevo en Groovy y tengo un problema simple. Todo lo que quiero hacer es extraer ciertos elementos de un archivo XML y crear un nuevo archivo con él. Aquí hay un XML de ejemplo, usemos un archivo Maven pom:

<project> <modelVersion>4.0.0</modelVersion> <groupId>com.group</groupId> <artifactId>artifact</artifactId> <version>1.4</version> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>

Sé cómo analizar XML en Groovy:

def project = new XmlParser().parse("pom.xml") project.groupId.each{ println it.text() }

También sé cómo crear XML en Groovy:

def xml = new groovy.xml.MarkupBuilder() xml.project (){ modelVersion("artifactId") groupId("com.group") artifactId("artifact") }

Sin embargo, parece que tengo un problema para combinar los dos. Quiero, por ejemplo, tomar groupId , artifactId y todo el árbol de dependencias y crear un nuevo XML a partir de él. No puede ser tan difícil y quiero hacer uso de la simplicidad de Groovy.

Algo en esa línea (por supuesto, esto no funciona):

def newXml= new groovy.xml.MarkupBuilder() newXml.groupId= project.groupId newXml.dependencies = project.dependencyManagement.dependencies

Gracias. Ese código me ayudó mucho, pero ¿cómo puedo manejar el espacio de nombres, es decir, si la etiqueta del proyecto en la entrada es así?

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

A continuación, agrega algunas anotaciones extrañas a la salida. Todo lo que quiero es que la etiqueta del proyecto en el resultado también se vea así.


Puedes hacer esto con XmlSlurper :

import groovy.xml.* def pxml = ''''''<project> | <modelVersion>4.0.0</modelVersion> | <groupId>com.group</groupId> | <artifactId>artifact</artifactId> | <version>1.4</version> | <dependencyManagement> | <dependencies> | <dependency> | <groupId>junit</groupId> | <artifactId>junit</artifactId> | <version>4.8.2</version> | <scope>test</scope> | </dependency> | </dependencies> | </dependencyManagement> |</project>''''''.stripMargin() def p = new XmlSlurper().parseText( pxml ) String nxml = new StreamingMarkupBuilder().bind { project { dependecyManagement { dependencies { mkp.yield p.dependencyManagement.dependencies.children() } } } } println XmlUtil.serialize( nxml )

Que impresiones:

<?xml version="1.0" encoding="UTF-8"?> <project> <dependecyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> <scope>test</scope> </dependency> </dependencies> </dependecyManagement> </project>

Para manejar mejor los espacios de nombres, puede intentar:

def pxml = ''''''<project xmlns="http://maven.apache.org/POM/4.0.0" | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | <modelVersion>4.0.0</modelVersion> | <groupId>com.group</groupId> | <artifactId>artifact</artifactId> | <version>1.4</version> | <dependencyManagement> | <dependencies> | <dependency> | <groupId>junit</groupId> | <artifactId>junit</artifactId> | <version>4.8.2</version> | <scope>test</scope> | </dependency> | </dependencies> | </dependencyManagement> |</project>''''''.stripMargin() def p = new XmlSlurper().parseText( pxml ) String nxml = new StreamingMarkupBuilder().bind { mkp.declareNamespace( '''':"http://maven.apache.org/POM/4.0.0", ''xsi'':"http://www.w3.org/2001/XMLSchema-instance" ) project( ''xsi:schemaLocation'':p.@schemaLocation ) { dependecyManagement { dependencies { mkp.yield p.dependencyManagement.dependencies.children() } } } } println XmlUtil.serialize( nxml )

Que debería darte:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <dependecyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> <scope>test</scope> </dependency> </dependencies> </dependecyManagement> </project>