Сериализатор JAXB из объектов Java в XML

Я новичок в программировании на XML, я пытаюсь записать некоторые Java-объекты в правильно сформированный и корректный XML-файл (по отношению к DTD-файлу),

Я узнал, что могу делать такие вещи, используя JAXP с Java. Мое приложение собирается получить некоторые данные, используя интерфейс, и затем мне нужно записать эти данные в файл XML с учетом DTD, который я ранее и уже создал.

Я пытался найти некоторую информацию об этой операции, но мне не удалось.

Как я должен сделать эту операцию?

РЕДАКТИРОВАТЬ: Обратите внимание, что мне нужно придерживаться 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>

2 ответа

Решение

Это в основном тот же способ конвертировать Java Object в XML с JAXBContext а также Marshaller с добавлением проверки правильности 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, затем вам нужно проверить id по dtd.

Здесь у вас есть пример, как сериализовать классы в XML.

Этот пример показывает, как проверить XML-файл с помощью dtd, который находится вне или внутри XML-файла.

Другие вопросы по тегам