Saltar al contenido

cómo analizar xml a hashmap?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4.5)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *