java - 适合新手的 Jaxb 编码

标签 java xml jaxb xsd marshalling

我想要实现的只是将其编码到 xml 文件

Contacto.java

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

@XmlRootElement
public class Contacto {
    @XmlElement
    public String nombre;
    @XmlElement
    public String telefono;
    @XmlElement
    public String email;
    @XmlElement
    public String direccion;
}

Actividad.java

import java.util.Calendar;

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

@XmlRootElement
public class Actividad {
    @XmlElement
    public Calendar fecha;
    @XmlElement
    public String lugar;
    @XmlElement
    public String motivo;
    @XmlElement
    public Contacto participante;
}

议程.java

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

@XmlRootElement
public class Agenda {
    @XmlElement
    public String nombrePropietario;
    @XmlElement
    public Actividad actividad;
    @XmlElement
    public Contacto contacto;
}

这是使用 JAXB 生成的 XML 架构

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="actividad" type="actividad"/>

  <xs:element name="agenda" type="agenda"/>

  <xs:element name="contacto" type="contacto"/>

  <xs:complexType name="actividad">
    <xs:sequence>
      <xs:element name="fecha" type="xs:dateTime" minOccurs="0"/>
      <xs:element name="lugar" type="xs:string" minOccurs="0"/>
      <xs:element name="motivo" type="xs:string" minOccurs="0"/>
      <xs:element name="participante" type="contacto" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="contacto">
    <xs:sequence>
      <xs:element name="nombre" type="xs:string" minOccurs="0"/>
      <xs:element name="telefono" type="xs:string" minOccurs="0"/>
      <xs:element name="email" type="xs:string" minOccurs="0"/>
      <xs:element name="direccion" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="agenda">
    <xs:sequence>
      <xs:element name="nombrePropietario" type="xs:string" minOccurs="0"/>
      <xs:element ref="actividad" minOccurs="0"/>
      <xs:element ref="contacto" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="principal">
    <xs:sequence/>
  </xs:complexType>
</xs:schema>

这是我尝试实例化其他一些类并将其数据编码到 xml 文件的类:

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

import java.util.Calendar;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;

import java.lang.Object;
import java.io.IOException;


public class Principal {
    public static void main(String[] args) {

        Contacto contacto = new Contacto();
        contacto.nombre = "John Doe";
        contacto.telefono = "911";
        contacto.email =  "johndoe@gmail.com";
        contacto.direccion = "742 Evergreen Terrace";

        Actividad actividad = new Actividad();

        Calendar cal = Calendar.getInstance();
        cal.set(2013,04,17,15,30,00);
        actividad.fecha = cal;
        actividad.lugar = "General Pico";
        actividad.motivo = "Reunion";
        actividad.participante = contacto;

        Agenda agenda = new Agenda();
        agenda.nombrePropietario = "John Smith";
        agenda.actividad = actividad;
        agenda.contacto = contacto;


        try {
            File file = new File("archivo.xml");

            JAXBContext jaxbContext = JAXBContext.newInstance(Contacto.class);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

            // Salida
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

            OutputStream os = new FileOutputStream(file);

            jaxbMarshaller.marshal(contacto, os);
            jaxbMarshaller.marshal(contacto, System.out);
/*
            jaxbMarshaller.marshal(actividad, os);
            jaxbMarshaller.marshal(actividad, System.out);

            jaxbMarshaller.marshal(agenda, os);
            jaxbMarshaller.marshal(agenda, System.out);
 */
        } catch (Exception e) { //JAXBException e
            e.printStackTrace();
        }
    }


}

问题是它永远不会生成 .xml 文件。我只需要解决这个小问题,我知道我可能不会以最好的方式面对这个问题,但我被困在这里。

提前致谢!

最佳答案

更新#2

仔细检查 java.io.File 是否在您认为的位置创建。您可以按如下方式检查:

File file = new File("archivo.xml");
System.out.println(file.getAbsolutePath());
<小时/>

更新#1

您可能会发现直接编码到java.io.File:

<小时/>

您需要在编码操作后关闭FileOutputStream

    FileOutputStream out = new FileOutputStream("archivo.xml");
    marshaller.marshal(config, out);
    out.close();

顺便说一句,您不需要所有这些 @XmlElement 注释,因为默认情况下所有公共(public)属性和字段都将被视为默认映射。

关于java - 适合新手的 Jaxb 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16533023/

相关文章:

java - 访问不同 Java 类的变量时遇到问题

java - 如何在特定情况下避免 OutOfMemory 问题

php - 使用 PHP 管理 GMail 邮件过滤器 XML 文件

xml - 多大的 RSS 提要 XML 文件太大了?

java - RESTful 1-N 可选关系

jaxb - 如何使用 JAXB 以特殊顺序制作@XmlAttribute?

java - 哪个模板是 netbeans 默认的新 java 类?

java - 如何获取当前本地时间的 UTC 转换后的 Java 时间戳?

xml - XML DTD 中的 PCDATA 与 CDATA

java - 使用与 xml 适配器一起使用的自定义类型编码空值