JAXB 序列化器从 java 个对象到 xml

JAXB serializer from java objects to xml

我是 XML 编程的新手,我正在尝试将一些 java 对象写入格式正确且有效的 XML 文件(相对于 DTD 文件),

我发现我可以使用带有 Java 的 JAXP 来完成这类事情。 我的应用程序将使用接口检索一些数据,然后我需要根据我之前创建的 DTD 将这些数据写入 XML 文件。

我试图找到有关此操作的一些信息,但我失败了。

这个操作应该怎么做?

编辑:请注意我需要坚持使用 DTD(不能切换到 XML 模式)并且我需要从 Java 对象到 XML,而不是反之亦然。 我发现重复的答案不适用于我的问题。

不知道 DTD 是否有任何帮助,但它就是。

DTD

<!ELEMENT AIRCRAFTS (AIRCRAFT+)>
<!ELEMENT AIRCRAFT (MODEL, SEATS)>
<!ELEMENT MODEL (#PCDATA)>
<!ELEMENT SEATS (SEAT+)>
<!ELEMENT SEAT (#PCDATA)>

<!ELEMENT FLIGHTS (FLIGHTREADER+)>
<!ELEMENT FLIGHTREADER (DEPARTURE, TIME, DESTINATION)>
<!ELEMENT DEPARTURE (#PCDATA)>
<!ELEMENT TIME (HOUR, MINUTE)>
<!ELEMENT HOUR (#PCDATA)>
<!ELEMENT MINUTE (#PCDATA)>
<!ELEMENT DESTINATION (#PCDATA)>


<!ELEMENT FLIGHTINSTANCES (FLIGHTINSTANCEREADER+)>
<!ELEMENT FLIGHTINSTANCEREADER (AIRCRAFTID, DATE, DELAY, DEPARTUREGATE, FLIGHTREADERID, PASSENGERREADER+, STATUS)>
<!ELEMENT AIRCRAFTID (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT DELAY (#PCDATA)>
<!ELEMENT DEPARTUREGATE (#PCDATA)>
<!ELEMENT FLIGHTREADERID (#PCDATA)>
<!ELEMENT PASSENGERREADER (NAME, FLIGHTINSTANCEID, SEATID, BOARDED)>
<!ELEMENT FLIGHTINSTANCEID (#PCDATA)>
<!ELEMENT BOARDED (#PCDATA)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT SEATID (#PCDATA)>
<!ELEMENT STATUS (#PCDATA)>

<!ATTLIST FLIGHTINSTANCEREADER id ID #REQUIRED>
<!ATTLIST FLIGHTREADER id ID #REQUIRED>
<!ATTLIST AIRCRAFT id ID #REQUIRED>

首先你需要将对象序列化为xml,然后你需要根据dtd验证id。

Here 你有如何将 类 序列化为 xml.

的示例

This one 显示如何使用 xml 文件外部或内部的 dtd 验证 xml 文件。

使用 JAXBContextMarshaller 将 Java 对象转换为 XML 的方法基本相同,并添加了验证 XML 使用 DTD 的验证.

查看示例代码:

    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser sp = spf.newSAXParser();
    XMLReader xr = sp.getXMLReader();

    JAXBContext jc = JAXBContext.newInstance("blog.log4j");
    Unmarshaller unmarshaller = jc.createUnmarshaller();
    UnmarshallerHandler unmarshallerHandler = unmarshaller.getUnmarshallerHandler();
    xr.setContentHandler(unmarshallerHandler);

    FileInputStream xmlStream = new FileInputStream("src/blog/log4j/sample1.xml");
    InputSource xmlSource = new InputSource(xmlStream);
    xr.parse(xmlSource);

    Log4JConfiguration config = (Log4JConfiguration) unmarshallerHandler.getResult();

    Marshaller marshaller = jc.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.marshal(config, System.out);

Source.