Saltar al contenido

¿Cómo leer y escribir archivos xml?

Hola usuario de nuestra web, encontramos la solución a tu interrogante, deslízate y la encontrarás más abajo.

Solución:

Aquí hay un ejemplo de DOM rápido que muestra cómo leer y escribir un archivo xml simple con su dtd:




    User
    Author
    Admin
    

y el dtd:







Primero importe estos:

import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.xml.sax.*;
import org.w3c.dom.*;

Aquí hay algunas variables que necesitará:

private String role1 = null;
private String role2 = null;
private String role3 = null;
private String role4 = null;
private ArrayList rolev;

Aquí hay un lector (String xml es el nombre de su archivo xml):

public boolean readXML(String xml) 
        rolev = new ArrayList();
        Document dom;
        // Make an  instance of the DocumentBuilderFactory
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try 
            // use the factory to take an instance of the document builder
            DocumentBuilder db = dbf.newDocumentBuilder();
            // parse using the builder to get the DOM mapping of the    
            // XML file
            dom = db.parse(xml);

            Element doc = dom.getDocumentElement();

            role1 = getTextValue(role1, doc, "role1");
            if (role1 != null) 
                if (!role1.isEmpty())
                    rolev.add(role1);
            
            role2 = getTextValue(role2, doc, "role2");
            if (role2 != null) 
                if (!role2.isEmpty())
                    rolev.add(role2);
            
            role3 = getTextValue(role3, doc, "role3");
            if (role3 != null) 
                if (!role3.isEmpty())
                    rolev.add(role3);
            
            role4 = getTextValue(role4, doc, "role4");
            if ( role4 != null) 
                if (!role4.isEmpty())
                    rolev.add(role4);
            
            return true;

         catch (ParserConfigurationException pce) 
            System.out.println(pce.getMessage());
         catch (SAXException se) 
            System.out.println(se.getMessage());
         catch (IOException ioe) 
            System.err.println(ioe.getMessage());
        

        return false;
    

Y aquí un escritor:

public void saveToXML(String xml) 
    Document dom;
    Element e = null;

    // instance of a DocumentBuilderFactory
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try 
        // use factory to get an instance of document builder
        DocumentBuilder db = dbf.newDocumentBuilder();
        // create instance of DOM
        dom = db.newDocument();

        // create the root element
        Element rootEle = dom.createElement("roles");

        // create data elements and place them under root
        e = dom.createElement("role1");
        e.appendChild(dom.createTextNode(role1));
        rootEle.appendChild(e);

        e = dom.createElement("role2");
        e.appendChild(dom.createTextNode(role2));
        rootEle.appendChild(e);

        e = dom.createElement("role3");
        e.appendChild(dom.createTextNode(role3));
        rootEle.appendChild(e);

        e = dom.createElement("role4");
        e.appendChild(dom.createTextNode(role4));
        rootEle.appendChild(e);

        dom.appendChild(rootEle);

        try 
            Transformer tr = TransformerFactory.newInstance().newTransformer();
            tr.setOutputProperty(OutputKeys.INDENT, "yes");
            tr.setOutputProperty(OutputKeys.METHOD, "xml");
            tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            tr.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "roles.dtd");
            tr.setOutputProperty("http://xml.apache.org/xsltindent-amount", "4");

            // send DOM to file
            tr.transform(new DOMSource(dom), 
                                 new StreamResult(new FileOutputStream(xml)));

         catch (TransformerException te) 
            System.out.println(te.getMessage());
         catch (IOException ioe) 
            System.out.println(ioe.getMessage());
        
     catch (ParserConfigurationException pce) 
        System.out.println("UsersXML: Error trying to instantiate DocumentBuilder " + pce);
    

getTextValue está aquí:

private String getTextValue(String def, Element doc, String tag) 
    String value = def;
    NodeList nl;
    nl = doc.getElementsByTagName(tag);
    if (nl.getLength() > 0 && nl.item(0).hasChildNodes()) 
        value = nl.item(0).getFirstChild().getNodeValue();
    
    return value;

¡Agregue algunos accesores y mutadores y listo!

Escritura de XML utilizando JAXB (Arquitectura Java para enlaces XML):

http://www.mkyong.com/java/jaxb-hello-world-example/

package com.mkyong.core;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Customer 

    String name;
    int age;
    int id;

    public String getName() 
        return name;
    

    @XmlElement
    public void setName(String name) 
        this.name = name;
    

    public int getAge() 
        return age;
    

    @XmlElement
    public void setAge(int age) 
        this.age = age;
    

    public int getId() 
        return id;
    

    @XmlAttribute
    public void setId(int id) 
        this.id = id;
    

 

package com.mkyong.core;

import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

public class JAXBExample 
    public static void main(String[] args) 

      Customer customer = new Customer();
      customer.setId(100);
      customer.setName("mkyong");
      customer.setAge(29);

      try 

        File file = new File("C:\file.xml");
        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

        // output pretty printed
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        jaxbMarshaller.marshal(customer, file);
        jaxbMarshaller.marshal(customer, System.out);

           catch (JAXBException e) 
        e.printStackTrace();
          

    

La respuesta anterior solo trata con el analizador DOM (que normalmente lee todo el archivo en la memoria y lo analiza, lo que para un archivo grande es un problema), podría usar un analizador SAX que use menos memoria y sea más rápido (de todos modos, eso depende de su código).

El analizador SAX devuelve la llamada a algunas funciones cuando encuentra un inicio de elemento, final de elemento, attribute, texto entre elementos, etc., para que pueda analizar el documento y al mismo tiempo obtener lo que necesita.

Algún código de ejemplo:

http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

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



Utiliza Nuestro Buscador

Deja una respuesta

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