araç köşesi

XML a clase Java (JAXB)

Genere clases Java con anotaciones JAXB a partir de un XML de ejemplo; los atributos pasan a @XmlAttribute y los elementos repetidos a List<>

Sus datos se quedan con usted. La conversión ocurre dentro del navegador; no se envía nada a ningún servidor.

Cómo funciona

Para leer en Java el contenido de un servicio SOAP o de un XML como una factura CFDI, JAXB necesita clases con anotaciones que coincidan con el documento. Pegue un XML de ejemplo en el panel izquierdo; a la derecha aparece una clase por cada elemento. El elemento raíz recibe @XmlRootElement(name = "pedido") y los elementos anidados se escriben dentro de la clase raíz como public static class, así que la salida compila como un solo archivo Pedido.java. Los atributos del elemento (numero="1024") pasan a campos @XmlAttribute y los subelementos a campos @XmlElement. En un elemento con atributos y texto a la vez (<articulo clave="MX-11">Olla de acero</articulo>) el texto va a un campo @XmlValue. Si un elemento aparece dos veces bajo el mismo padre, el campo es List<Articulo>. El tipo se deduce del texto: 1024 es int, 1250.50 es double y true es boolean; 01000 empieza por cero y sigue como String, porque puede ser un código postal o un teléfono. Un atributo que falta en algunos elementos usa un tipo envoltorio como Integer para poder quedar vacío. Use jakarta con Spring Boot 3 y Jakarta EE; use javax en proyectos con Java 8.

Esta herramienta también se busca como xml a clase java, xml to java, convertir xml a java, xml a pojo, generar clases jaxb.

¿Qué es JAXB?

JAXB (Jakarta XML Binding) es el estándar de Java para convertir entre objetos y documentos XML. Las anotaciones @XmlRootElement, @XmlElement y @XmlAttribute indican qué campo corresponde a qué parte del XML; Unmarshaller lee el XML y crea objetos, Marshaller hace lo contrario. Desde Java 11 ya no viene en el JDK y se agrega al proyecto como dependencia.

¿Qué es Atributo y elemento XML?

En XML un dato puede ir como elemento (<total>1250</total>) o como atributo (<pedido numero="1024">). Un atributo lleva un solo valor de texto y no se repite; un elemento puede tener subelementos y aparecer varias veces. JAXB distingue los dos con @XmlAttribute y @XmlElement; si se usa la anotación equivocada, el campo se lee vacío.

¿Qué diferencia hay entre JAXB y Jackson XML?

JAXB es el estándar de Java para XML y trabaja con anotaciones como @XmlElement; lo esperan los clientes SOAP, las clases que xjc genera desde un XSD y los servidores Jakarta EE. Jackson XML (jackson-dataformat-xml) es la extensión XML de Jackson, la biblioteca que se usa para JSON, y tiene sus propias anotaciones como @JacksonXmlProperty; con un módulo también lee las de JAXB. Si su proyecto se basa en SOAP o en XSD, use JAXB; si es un proyecto REST que ya procesa JSON con Jackson, Jackson XML suma menos dependencias.

Qué parte del XML se convierte en qué anotación JAXB

JAXB relaciona el XML con los campos Java mediante anotaciones. La herramienta anota cada campo con su nombre original del XML, así que la lectura funciona aunque el nombre del campo Java sea distinto. Las clases llevan @XmlAccessorType(XmlAccessType.FIELD): JAXB lee los campos, no los getters; los getters y setters son solo para su propio código.

La decisión de lista no se toma mirando un solo padre: si un pedido tiene un artículo y otro tiene tres, articulo es List<Articulo> en todas partes. De lo contrario, al leer un documento con un solo artículo el tipo del campo no coincidiría.

  • <pedido numero="1024"> → @XmlAttribute(name = "numero") private int numero;
  • <total>1250.50</total> → @XmlElement(name = "total") private double total;
  • <articulo clave="MX-11">Olla de acero</articulo> → clase Articulo: @XmlAttribute clave + @XmlValue value
  • dos <articulo> → @XmlElement(name = "articulo") private List<Articulo> articulo;

Límites honestos: espacios de nombres, contenido mixto y fechas

Los espacios de nombres (xmlns) no se resuelven: en <cfdi:Emisor> se quita el prefijo y el campo se anota solo como "Emisor". Si su documento usa espacios de nombres, agregue a mano namespace = "..." en las clases generadas o una definición @XmlSchema en package-info.java. Para esquemas grandes, como el CFDI 4.0 del SAT, es más fiable generar las clases desde el XSD con xjc.

En un elemento que mezcla texto y subelementos (<nota>Pago <b>contra entrega</b></nota>) el texto se omite y la clase lleva un comentario que lo avisa, porque JAXB no admite @XmlValue junto a @XmlElement en la misma clase. Las fechas en texto (2026-09-27) no pasan a LocalDate; quedan como String. Los tipos se deducen de un solo ejemplo: cuanto más variado sea su XML, más exacta será la clase.

Preguntas frecuentes

¿Cómo genero una clase Java a partir de un XML?

Pegue un XML de ejemplo en el panel izquierdo de esta página y escriba el nombre del paquete. A la derecha aparece una clase Java con las anotaciones JAXB listas. Copie o descargue el código; el archivo lleva el nombre de la clase raíz y se puede agregar tal cual a su proyecto.

¿Uso jakarta o javax?

JAXB salió del JDK en Java 11 y con Jakarta EE 9 el paquete pasó a llamarse jakarta.xml.bind. Si usa Spring Boot 3 o un servidor Jakarta EE actual, use jakarta. Si el proyecto corre en Java 8 o con Spring Boot 2, use javax; con el paquete equivocado el código no compila.

¿Por qué el código postal quedó como String y no como int?

Un valor que empieza por cero (01000, 055…) pierde ese cero si se lee como número. Por eso la herramienta deja como String los valores que empiezan por cero y los de más de 18 dígitos. Si quiere todos los campos como texto, ponga «Números y valores true/false» en Todo String.

¿El XML que pego se envía a un servidor?

No. La lectura del XML, la deducción de tipos y la escritura del código Java ocurren por completo en su navegador; ni siquiera la respuesta de un servicio con datos de clientes sale de esta página.