No olvides que en las ciencias informáticas un problema casi siempre tiene varias resoluciones, no obstante nosotros aquí te mostraremos lo más óptimo y mejor.
Solución:
Utilizar JAXB
para leer de xml
y guárdelo en un objeto personalizado.
Clase de objeto personalizado:
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlRootElement(name = "Details")
@XmlType(propOrder = "detailA", "detailB" )
public class Details
private List detailA;
private List detailB;
public void setDetailA(List detailA)
this.detailA = detailA;
@XmlElementWrapper(name = "detail-a")
@XmlElement(name = "detail")
public List getDetailA()
return detailA;
public void setDetailB(List detailB)
this.detailB = detailB;
@XmlElementWrapper(name = "detail-b")
@XmlElement(name = "detail")
public List getDetailB()
return detailB;
Extraiga los datos de su xml en el objeto, luego agregue contenido a un mapa como desee:
public static void main(String[] args) throws JAXBException, FileNotFoundException
System.out.println("Output from our XML File: ");
JAXBContext context = JAXBContext.newInstance(Details.class);
Unmarshaller um = context.createUnmarshaller();
Details details = (Details)um.unmarshal(new FileReader("details.xml"));
List detailA = details.getDetailA();
List detailB = details.getDetailB();
Map map = new HashMap();
map.put("detail-a", detailA.toArray(new String[detailA.size()]));
map.put("detail-b", detailB.toArray(new String[detailB.size()]));
for (Map.Entry entry : map.entrySet())
//key "detail a" value="attribute 1 of detail a","attribute 2 of detail a","attribute 3 of detail a"
System.out.print("Key "" +entry.getKey()+"" value=");
for(int i=0;i
La salida será:
Output from our XML File: Key "detail-a" value="attribute 1 of detail a","attribute 2 of detail a","attribute 3 of detail a" Key "detail-b" value="attribute 1 of detail b","attribute 2 of detail b"
Como nota: esto funcionará solo para el xml que proporcionó como entrada en su pregunta, si necesita agregar más detalles como detail-c
y así sucesivamente, también debe definirlos en su objeto personalizado.
XML utilizado:
attribute 1 of detail a
attribute 2 of detail a
attribute 3 of detail a
attribute 1 of detail b
attribute 2 of detail b
No puedo resistirme a presentar una solución mucho más corta usando XMLBeam que funciona con cualquier cantidad de subelementos "detalle-x".
public class Tetst
@XBDocURL("resource://test.xml")
public interface Projection
@XBRead("name()")
String getName();
@XBRead("./detail")
List getDetailStrings();
@XBRead("/Details/*")
List getDetails();
@Test
public void xml2Hashmap() throws IOException
HashMap> hashmap = new HashMap>();
for (Projection p : new XBProjector().io().fromURLAnnotation(Projection.class).getDetails())
System.out.println(p.getName() + ": " + p.getDetailStrings());
hashmap.put(p.getName(), p.getDetailStrings());
esto se imprime
detail-a: [ attribute 1 of detail a , attribute 2 of detail a , attribute 3 of detail a ]
detail-b: [ attribute 1 of detail b , attribute 2 of detail b ]
para su ejemplo test.xml y llena un Hashmap.
Hay una biblioteca de subrayado-java. Soy el mantenedor del proyecto. ejemplo en vivo
import com.github.underscore.lodash.U;
import java.util.Map;
public class Main
@SuppressWarnings("unchecked")
public static void main(String[] args)
Map map = U.fromXmlMap(
"rn" +
" rn" +
"rn" +
" attribute 1 of detail a rn" +
" attribute 2 of detail a rn" +
" attribute 3 of detail a rn" +
"rn" +
" rn" +
"rn" +
" rn" +
" attribute 1 of detail b rn" +
" attribute 2 of detail b rn" +
"rn" +
" rn" +
"rn" +
"rn" +
"");
System.out.println(map);
// Details=detail-a=detail=[ attribute 1 of detail a , attribute 2 of detail a , attribute 3 of detail a ],
// detail-b=detail=[ attribute 1 of detail b , attribute 2 of detail b ], #omit-xml-declaration=yes
Nos puedes añadir valor a nuestro contenido tributando tu veteranía en las notas.