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 文件。
使用 JAXBContext
和 Marshaller
将 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);
我是 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 文件。
使用 JAXBContext
和 Marshaller
将 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);