从xml创建没有架构的Jaxb类

如何创建一个简单的jaxb Java类来表示以下xml

         

可以有多个myelem ,每个myelem可以包含多个key

我不想使用xsd

这是我们用于使用类而不是XSD使用JAXB转换为XML或从XML转换的类的副本。 (我们还使用JAXB生成我们的XSD)。

编辑:我刚刚重新阅读了这个问题。 如果您正在询问如何从该XML生成Java源代码,那么您将不得不自己解决这个问题,或者使用XSD并使用JAXB将其转换为类。 如果您已经拥有该类并且想要将XML转换为Java对象,那么下面的代码将适合您。

 package com.mycompany.types; import java.io.StringReader; import java.io.StringWriter; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlTransient; /** * Utility class to make it convenient to marshal and unmarshal the classes * generated by JAXB. */ @XmlTransient public final class Utility { // // Static initialization // static { try { JAXB_CONTEXT = JAXBContext.newInstance(TestClass.class); // The following fails with a javax.xml.bind.JAXBException. // class mycompany.types.TestClass nor any of its super class is known // to this context. // JAXB_CONTEXT = // JAXBContext.newInstance("com.mycompany.types", // Utility.class.getClassLoader()); } catch (Exception e) { throw new ExceptionInInitializerError(e); } } // // Constructors // // // Hidden constructor that prevents an object from being created. // private Utility() { // Do nothing. } // // Additional methods // /** * Unmarshals an XML string to a TestClass object. * * @param xml the XML string to parse * @return the resulting TestClass * @throws JAXBException if there are XML errors */ public static TestClass parseTestClass(String xml) throws JAXBException { Unmarshaller unmarshaller = JAXB_CONTEXT.createUnmarshaller(); return (TestClass)unmarshaller.unmarshal(new StringReader(xml)); } /** * Marshals a TestClass object to an XML string. * * @param testClass * @return the resulting XML string * @throws JAXBException if there are XML errors */ public static String printTestClass(TestClass testClass) throws JAXBException { Marshaller marshaller = JAXB_CONTEXT.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); StringWriter writer = new StringWriter(); marshaller.marshal(testClass, writer); return writer.toString(); } // // Attributes // private static final JAXBContext JAXB_CONTEXT; } 

这是一个基本的例子:

 import java.io.FileReader; import java.util.List; import javax.xml.bind.JAXB; 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; @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name="rootelem") class RootElem { List myelem; } @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name="myelem") class MyElem { @XmlAttribute String name; @XmlAttribute Boolean myatt; @XmlElement(name="Key") List keys; } @XmlAccessorType(XmlAccessType.FIELD) class Key { @XmlAttribute String value; } public class Test1 { public static void main(String[] args) throws Exception { RootElem r = JAXB.unmarshal(new FileReader("test.xml"), RootElem.class); System.out.println(r); JAXB.marshal(r, System.out); } }