简体   繁体   English

从Java对象到XML的JAXB序列化器

[英]JAXB serializer from java objects to xml

I'm a newbie of XML programming, I'm trying to write some java objects to a well formed and valid XML file (with respect to a DTD file), 我是XML编程的新手,我正在尝试将一些Java对象写入格式正确的有效XML文件(相对于DTD文件),

I found out that I can do this kind of things using JAXP with Java. 我发现可以将JAXP与Java结合使用。 My application is going to retrieve some data using an interface, and then I need to write that data into an XML file with respect of a DTD I previously and already created. 我的应用程序将使用接口来检索一些数据,然后我需要根据先前已经创建的DTD将这些数据写入XML文件。

I tried to find some informations about this operations but I failed. 我试图找到有关此操作的一些信息,但失败了。

How am I supposed to do this operation? 我应该怎么做这个手术?

EDIT: Please note that I need to stick with DTD (Can't switch to a XML schema) and that I need to go FROM Java Objects TO XML, and not viceversa. 编辑:请注意,我需要坚持使用DTD(无法切换到XML模式),并且需要从Java Objects到XML,而不是相反。 I found that the Duplicated Answer is not applying for my question. 我发现重复答案不适用于我的问题。

Don't know if the DTD can be of any help, but here it is. 不知道DTD是否可以提供任何帮助,但是就在这里。

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>

It's basically the same way to convert Java Object to XML with JAXBContext and Marshaller with an addition of validation the XML validation with DTD. 基本上与使用JAXBContextMarshaller将Java Object转换为XML的方法相同,另外还添加了使用DTD进行XML验证的验证。

See the sample code: 请参见示例代码:

    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 . 来源

First you need to serialize object to xml, then you need validate id against dtd. 首先,您需要将对象序列化为xml,然后需要针对dtd验证ID。

Here you have example how to serialzie classes to xml. 在这里,您有示例如何将类序列化为xml。

This one shows how to validate xml file with dtd that is outside or inside xml file. 示例显示了如何使用xml文件外部或内部的dtd验证xml文件。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM