Проверка DTD из классов JaxB - PullRequest
0 голосов
/ 09 марта 2019

Мне пришлось создать несколько классов Java для генерации XML, начиная с файла DTD.

Я использовал утилиту jxc:

xjc -dtd -d generatedsrc -p com.examples log4j.dtd

Я мог сгенерировать xml, но он не получен, и у меня нет другой информации, кроме этого DTD.Как я могу проверить DTD по XML?Например, в DTD можно определить обязательное поле, которое я не установил в своем объекте перед сортировкой, как я могу найти то, что мне не хватает?

1 Ответ

1 голос
/ 12 марта 2019

Есть несколько примеров для проверки 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 &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

...