entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Abrir archivos con extensión .xml con aplicación en java

Hola a todos, quisiera saber si me pueden ayudar a resolver una problema que tengo; Cree un programa en java y lo pase a ejecutable (.exe) y quiero que ciertos archivos con extensión .xml se abran al dar doble clic con este programa.

Considerando que al estar corriendo la aplicación si lo puedo hacer especificando la ruta del archivo y visualizando su información en un Jtxarea.

¿Como le puedo hacer? 

1voto

MitsuGami comentado

No respondas para comentar, solo comenta ;)

Ve la actualización de mi respuesta (Edit 2).

2 Respuestas

1voto

cloudman Puntos4020

Buenas.

Para lo que quieres hacer puedes utilizar JAXB.

Basicamente con jaxb partes de un bean de java con varias anotaciones propias, lo cual te permitirá pasar de un objeto java a XML (marshall) o al revés de un fichero XML a un objeto java (unmarshall).

Te dejo un enlace para que veas un ejemplo muy sencillo y puedas partir de esto.

http://examples.javacodegeeks.com/core-java/xml/bind/jaxbcontext/jaxb-hello-world-example/

Puede parecer un poco complicado al principio pero no lo es, espero que te sea util al menos para saber por donde empezar.

Un saludo.

0voto

Petronilo comentado

Muchas gracias por la ayuda pero eso ya lo hace el programa perdón por no ser especifico pero lo que quiero es que cuando yo le de doble clic sobre el archivo xml este pueda abrirlo con mi programa (sin la necesidad de especificarle la ruta o cargar el archivo desde Abrir).

Que me recomiendan hacer

1voto

MitsuGami Puntos8010

Suponiendo que tienes un XML así:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<User status="Gold">
    <Name>Pepito Pérez</Name>
    <Age>22</Age>
    <History online="true">
        <LastDepositDate>16-08-2015</LastDepositDate>
        <LastWithdrawalDate>06-09-2015</LastWithdrawalDate>
    </History>
</User>

Entonces, creas una clase que Represente a ese XML:

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

@XmlRootElement(name = "User")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {

    @XmlAttribute(name = "status")
    private String status;
    @XmlElement(name = "Name")
    private String name;
    @XmlElement(name = "Age")
    private int age;
    @XmlElement(name="History")
    private History history;

    public User() {

    }

    public User(String name, int age, History history) {
        super();
        this.name = name;
        this.age = age;
        this.history = history;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public History getHistory() {
        return history;
    }

    public void setHistory(History history) {
        this.history = history;
    }

}

@XmlRootElement indica que esa clase representa al tag root del archivo XML. @XmlElement indica que esas propiedades son tags del archivo XML. @XmlAttribute es un atributo del tag (clase) en la que se le declara.

Si te fijas, History tiene sus propios datos, por lo que debe ser otra clase:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;

@XmlAccessorType(XmlAccessType.FIELD)
public class History {

    @XmlElement(name = "LastDepositDate")
    private String lastDepositDate;
    @XmlElement(name = "LastWithdrawalDate")
    private String lastWithdrawalDate;
    @XmlAttribute(name = "online")
    private boolean online;

    public History() {

    }

    public History(String lastDepositDate, String lastWithdrawalDate) {
        super();
        this.lastDepositDate = lastDepositDate;
        this.lastWithdrawalDate = lastWithdrawalDate;
    }

    public String getLastDepositDate() {
        return lastDepositDate;
    }

    public void setLastDepositDate(String lastDepositDate) {
        this.lastDepositDate = lastDepositDate;
    }

    public String getLastWithdrawalDate() {
        return lastWithdrawalDate;
    }

    public void setLastWithdrawalDate(String lastWithdrawalDate) {
        this.lastWithdrawalDate = lastWithdrawalDate;
    }

    public boolean isOnline() {
        return online;
    }

    public void setOnline(boolean online) {
        this.online = online;
    }

}

Ahora creamos un Marshaller y un Unmarshaller genéricos:


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

public class Marshaller<T> {

    private Class<T> clazz;

    public Marshaller(Class<T> clazz) {
        this.clazz = clazz;
    }

    public void marshall(String xmlPath, T object) {
        JAXBContext context;

        try {
            File xml = new File(xmlPath);
            context = JAXBContext.newInstance(clazz);
            javax.xml.bind.Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, true);

            marshaller.marshal(object, xml);
        } catch(JAXBException e) {
            e.printStackTrace();
        }
    }
}

El método marshall convierte un objeto a XML y lo envía a un stream de salida (OutputStream). Si lo envías al stream System.out, el XML se imprimirá en consola; si lo envías al stream File, se persiste en el disco duro.

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

public class Unmarshaller<T> {

    private Class<T> clazz;

    public Unmarshaller(Class<T> clazz) {
        this.clazz = clazz;
    }

    @SuppressWarnings("unchecked")
    public T unmarshall(String xmlPath) {
        JAXBContext context;
        javax.xml.bind.Unmarshaller unmarshaller;
        T result = null;
        try  {
            File xml = new File(xmlPath);
            context = JAXBContext.newInstance(clazz.getClass());

            unmarshaller = context.createUnmarshaller();
            result = (T) unmarshaller.unmarshal(xml);
        } catch(JAXBException e) {
            e.printStackTrace();
        }

        return result;
    }
}

Y cargas los XML así:

public static void main(String[] args) {

    Unmarshaller<User> unmarshaller = new Unmarshaller<>(User.class);
    // args[0] contiene la ruta del archivo abierto
    User user = unmarshaller.unmarshall(args[0]);

    // imprime 'Pepito Pérez'
    System.out.printf("Nombre:\t%s\n", user.getName());
}

Ahora ya puedes trabajar el XML como objeto.

Edit

Al ver tu comentario en la respuesta de @cloudman, me he dado cuenta que no necesitas esto. Lo que tu deseas es asociar un determinado tipo de archivo a tu programa, y eso creo depende del SO. Quizás este artículo de Microsoft te pueda ayudar: https://support.microsoft.com/es-es/kb/307859

Edit 2

Solo he encontrado esta forma:

  1. Asocias una extensión a un tipo de archivo:

    assoc .xml=XML

  2. Asocias el tipo de archivo XML a la JVM:

    ftype XML=C:\Program Files\Java\jre1.8.0_60\bin\javaw.exe %*

Más información: http://www.rgagnon.com/javadetails/java-0592.html

0voto

Petronilo comentado

si, eso mismo hago, lo estoy programando en java en la plataforma NetBeans
hago el constructor y se queda en .jar
ejecuto la aplicación y corre el . jar y especifico la ruta ruta de mi archivo XML y hace lo que tiene que hacer.

Ahora lo que quiero hacer es de que con dos cliK se abra mi archivo .XML, sin la necesidad de especificar la ruta del archivo, con mi aplicación en java

(es necesario convertir el .jar a .exe)

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta