2008-11-20 15 views
8

Sé que esto no es realmente para lo que es XPath, pero si tengo un HashMap de expresiones XPath para valores, ¿cómo haré para compilar un documento XML? He encontrado dom-4j's DocumentHelper.makeElement (branch, xpath) excepto que no puede crear atributos o indexar. Seguramente existe una biblioteca que puede hacer esto?JAVA: documento XML de compilación utilizando expresiones XPath

Map xMap = new HashMap(); 

xMap.put("root/entity/@att", "fooattrib"); 
xMap.put("root/array[0]/ele/@att", "barattrib"); 
xMap.put("root/array[0]/ele", "barelement"); 
xMap.put("root/array[1]/ele", "zoobelement"); 

se traduciría en:

<root> 
<entity att="fooattrib"/> 
<array><ele att="barattrib">barelement</ele></array> 
<array><ele>zoobelement</ele></array> 
</root> 
+0

Ver que: [http://stackoverflow.com/questions/508390/create-xml-nodes-based-on-xpath](http: //desbordamiento de pila.com/questions/508390/create-xml-nodes-based-on-xpath), hecho en C# pero responde al problema. – Benj

+0

Estoy buscando lo mismo. No puedo creer que no haya una biblioteca que lo permita. Desafortunadamente no tengo tiempo para crear uno, así que probablemente vaya con una solución rápida y sucia, quizás adaptando el siguiente código C# en Java, parece cubrir las necesidades básicas: http://stackoverflow.com/questions/ 508390/create-xml-nodes-based-on-xpath – Damien

Respuesta

2

busqué algo similar hace unos años - una especie de XPath se pueda escribir. Al final, no habiendo encontrado nada, me han pirateado algo que esencialmente construye el documento XML mediante la adición de nuevos nodos a padres expresiones:

parent="/" element="root" 
parent="/root" element="entity" 
parent="/root/entity" attribute="att" value="fooattrib" 
parent="/root" element="array" 
parent="/root" element="ele" text="barelement" 

(Esto era en sí misma para ser gobernado por un archivo de configuración XML, de ahí la apariencia de arriba.)

Sería tentador tratar de automatizar algo de esto para solo tomar el último elemento de la ruta, y hacer algo de eso, pero siempre sentí que había expresiones XPath que podía escribir que tales un enfoque tonto se equivocaría.

Otro enfoque que consideré, aunque no implementé (lo anterior fue "lo suficientemente bueno"), fue utilizar el excelente Jaxen para generar elementos que no existían, sobre la marcha si no existían.

Desde el Jaxen FAQ:

El único que se requiere es una implementación de la interfaz de org.jaxen.Navigator. No se requiere toda la interfaz, y también se proporciona una implementación predeterminada, en forma de org.jaxen.DefaultNavigator.

El DOMWriterNavigator sería envolver y DOMNavigator existente, y luego usar el método makeElement si el elemento no existía. Sin embargo, incluso con este enfoque, es probable que tenga que hacer un procesamiento previo/posterior de la consulta XPath para cosas como attributes y text() funciones.

2

Lo mejor que pude encontrar es utilizar una implementación de JAXB, que marshall/unmarshal objetos a xml y luego usé Dozer (http://dozer.sourceforge.net/documentation/mapbackedproperty.html) mapear los xpaths que eran claves en un mapa para los establecedores de métodos de objetos JAXB.

<mapping type="one-way" map-id="TC1"> 
<class-a>java.util.Map</class-a> 
<class-b>org.example.Foo</class-b> 
<field> 
    <a key="root/entity/@att">this</a> 
    <b>Foo.entity.att</b> 
    <a-hint>java.lang.String</a-hint> 
</field> 

Se trata más de una solución de dos pasos, pero realmente trabajó para mí.

Cuestiones relacionadas