Сериализатор 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-файла.