Java - JAXB y XML NameSpaces

 
Vista:
sin imagen de perfil

JAXB y XML NameSpaces

Publicado por Pizo (2 intervenciones) el 24/10/2016 14:49:17
Buenos días.

Estoy teniendo el siguiente problema con JAXB (no tengo mucha experiencia con ello) y quería preguntaros si existe alguna solución.

A partir de un fichero XML, el cual define una serie de NameSpaces determinados para los distintos elementos del fichero XML, le estoy aplicando un unmarshall y después un marshall (el porqué no tiene importancia).

Lo que me ocurre es que al generar la nueva versión con marshall todas las declaraciones de NameSpaces se van al nodo raíz del fichero XML, cuando en el fichero original estaban declarados en unos puntos cocretos. ¿Hay manera de que el fichero generado mantenga los NameSpaces donde estaban en la versión orginal?

El fichero original sería algo así (es un ejemplo):

<xc:XmlCache xmlns:xc="XmlCache">
<xc:XmlCacheArea>
<mp:nickName xmlns:mp="mx.MarketParameters">
</mp:nickName>
</xc:XmlCacheArea>
</xc:XmlCache>

El fichero generado (tras la secuencia unmarshall - marshall) queda

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xc:XmlCache xmlns:xc="XmlCache" xmlns:mp="mx.MarketParameters" >
<xc:XmlCacheArea>
<mp:nickName/>
</xc:XmlCacheArea>
</xc:XmlCache>


Y la clase que estoy implementando (veréis algunas cosas raras pero es por necesidad):

package pizo.ejemplo;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

/**
* Hello world!
*
*/
public class App
{

public static void main( String[] args )
{

try {
ArrayList<File> xmlFileList = createXMLFileList();
ArrayList<Class> classList = createClassList();

Object xmlCache = null;
Class modelType = null;
int iClass = 0;

for(File xmlfile : xmlFileList){
modelType = classList.get(iClass);
xmlCache = unmarshallXML(xmlfile, modelType);
marshallPOJO(xmlfile, xmlCache, modelType);
iClass++;
}

} catch (JAXBException e){
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}

}

private static Object unmarshallXML(File xmlFile, Class modelType) throws JAXBException{
JAXBContext jaxbContext = JAXBContext.newInstance(modelType);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
return jaxbUnmarshaller.unmarshal(xmlFile);
}

private static void marshallPOJO(File xmlFile, Object xmlCache, Class modelType) throws JAXBException{
//File newXMLFile = new File("F:\\Proyecto\\Modelo de entidades\\xml\\bd\\marshalled_bdpr-bondPrice_ps.xml");
File newXMLFile = new File(xmlFile.getPath().concat("_marshalled.xml"));
JAXBContext jaxbContext = JAXBContext.newInstance(modelType);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

jaxbMarshaller.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper", new MdrsNameSpacePrefixMapper());
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

jaxbMarshaller.marshal(xmlCache, newXMLFile);
}

private static ArrayList<File> createXMLFileList(){
ArrayList<File> xmlFileList = new ArrayList<File>();

String sBond = new String("C:\\Proyecto\\Ejemplo\\");

xmlFileList.add(new File(sBond + "ejemplo.xml"));

return xmlFileList;
}

private static ArrayList<Class> createClassList(){
ArrayList<Class> classList = new ArrayList<Class>();

classList.add(XmlCache.class);

return classList;
}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

JAXB y XML NameSpaces

Publicado por Pizo (2 intervenciones) el 27/10/2016 08:24:11
Gracias KONNAN por tu respuesta. Sabía que podía utilizar DOM pero la gracia está en usar JAXB, que es lo que necesito. De todos modos, lo que me sucede no me supune mucho problema, era más bien curiosidad por saber si había manera de "solucionarlo".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar