#xml #jaxb #marshalling #dtd
#xml #jaxb #сортировка #dtd
Вопрос:
Мне пришлось создать несколько классов Java для генерации XML, начиная с файла DTD.
Я использовал утилиту jxc:
xjc -dtd -d generatedsrc -p com.examples log4j.dtd
Я мог бы сгенерировать xml, но в нем отказано получателю, и у меня нет другой информации, кроме этого DTD. Как я могу проверить DTD на соответствие XML?
Например, в DTD может быть определено обязательное поле, которое я не устанавливал в своем объекте перед сортировкой, как я могу найти то, чего мне не хватает?
Ответ №1:
Есть несколько примеров проверки DTD на соответствие xml. Я вставлю здесь один для удобства, а также ссылку в конце.
Для данного xml с включенным dtd, invalid_dtd.xml:
<?xml version="1.0"?>
<!-- invalid_dtd.xml
- Copyright (c) 2002-2014 HerongYang.com, All Rights Reserved.
-->
<!DOCTYPE dictionary [
<!ELEMENT dictionary (note, word )>
<!ELEMENT note ANY>
<!ELEMENT word (update?, name, definition , usage*)>
<!ELEMENT update EMPTY>
<!ATTLIST update
date CDATA #REQUIRED
editor CDATA #IMPLIED
>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name is_acronym (true | false) "false">
<!ELEMENT definition (#PCDATA)>
<!ELEMENT usage (#PCDATA | i)*>
<!ELEMENT i (#PCDATA)>
<!ENTITY herong "Dr. Herong Yang">
]>
<dictionary>
<note>Copyright (c) 2014 by amp;herong;</note>
<word>
<name is_acronym="true" language="EN">POP</name>
<definition>Post Office Protocol</definition>
<definition>Point Of Purchase</definition>
</word>
<word>
<update date="2014-12-23"/>
<name is_acronym="yes">XML</name>
<definition>eXtensible Markup Language</definition>
<note>XML comes from SGML</note>
</word>
<word>
<update editor="Herong Yang"/>
<name>markup</name>
<definition>The amount added to the cost price to calculate
the selling price - <i>Webster</i></definition>
</word>
</dictionary>
Простой класс для выполнения некоторых проверок:
public class DOMValidator {
public static void main(String[] args) {
try {
File x = new File("invalid_dtd.xml");
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setValidating(true);
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
ErrorHandler h = new MyErrorHandler();
documentBuilder.setErrorHandler(h);
documentBuilder.parse(x);
} catch (ParserConfigurationException e) {
System.out.println(e.toString());
} catch (SAXException e) {
System.out.println(e.toString());
} catch (IOException e) {
System.out.println(e.toString());
}
}
private static class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException {
System.out.println("Warning: ");
printInfo(e);
}
public void error(SAXParseException e) throws SAXException {
System.out.println("Error: ");
printInfo(e);
}
public void fatalError(SAXParseException e)
throws SAXException {
System.out.println("Fattal error: ");
printInfo(e);
}
private void printInfo(SAXParseException e) {
System.out.println(" Public ID: " e.getPublicId());
System.out.println(" System ID: " e.getSystemId());
System.out.println(" Line number: " e.getLineNumber());
System.out.println(" Column number: " e.getColumnNumber());
System.out.println(" Message: " e.getMessage());
}
}
}
Возможно, это то, что вы могли бы использовать?
Исходный источник: http://www.herongyang.com/XML/DTD-Validation-of-XML-with-DTD-Using-DOM.html
Комментарии:
1. Да, возможно, я попробую это, спасибо. Пока я нашел только универсальный командный инструмент, но он просто выдает мне «ошибку» без указания, где это было. Спасибо
2. @Tobia если вы поделитесь своим xml, dtd, я мог бы помочь и быть более конкретным
3. Я мог бы использовать эту проверку, я нашел свою ошибку, спасибо