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>