【问题标题】:JAXB serializer from java objects to xml从 java 对象到 xml 的 JAXB 序列化程序
【发布时间】:2015-01-29 18:44:56
【问题描述】:

我是 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>

【问题讨论】:

  • 这个answer 回答了你的问题。我应该知道,我最近尝试过,它奏效了。
  • 感谢您的回答,但我不认为问题是重复的,您链接我的那个没有回答我的问题并且不满足我的限制
  • 我提供的答案链接允许您从 DTD 生成 Java 对象(使用 xjc 随 JDK 一起在 bin 文件夹中)。它不会创建 XML 模式,但您仍然可以使用 JAXB 从 Java 对象生成 XML。从 DTD 创建模式可能会令人生畏。
  • 首先,再次感谢您的宝贵时间。我需要做的是从一些 java 对象开始生成一个有效的 XML(相对于 DTD)。我不想从 DTD 创建 Java 对象,那不是我的目标。我已经有了 Java 对象,我想使用 JAXP 将它们写到一个有效的 XML 文件中。

标签: java xml jaxp dtd


【解决方案1】:

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

查看示例代码:

    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.

【讨论】:

    【解决方案2】:

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

    Here 您有示例如何将类序列化为 xml。

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

    【讨论】:

    • 问题是关于如何根据一些DTD序列化XML中的对象。您的回答中没有解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多