有效的XML和DTD无法验证

时间:2016-09-29 18:51:23

标签: java xml validation

我正在尝试使用以下Java代码针对以下DTD验证以下xml。 (JDK 8 - 在类路径中正确找到所有文件)。它抛出了以下例外情况。

一切似乎都是正确的,当我在dml中嵌入dtd时,IDE没有显示任何红色下划线,所以我假设所有语法都是正确的。错误消息说例外是行号1.当我在DTD的顶部添加一个空行时,它将更改为行号2,所以我很确定它不喜欢DTD。我尝试使用通过互联网下载的示例进行相同操作,并得到同样的问题。

我做错了什么???

的test.xml:

<?xml version="1.0" encoding="UTF-8"?>
<properties>
    <property>key1=value1</property>
</properties>

test.dtd:

<!ELEMENT properties (property)*>
   <!ELEMENT property (#PCDATA)>

Validate.java:

public static void validateXml(String xmlFile, String dtdFile) 
    throws SAXException, IOException, ParserConfigurationException, URISyntaxException
{
    URL dtdUrl = XmlUtils.class.getClassLoader().getResource(dtdFile);
    System.out.println("DTD:\n" + new String(Files.readAllBytes(Paths.get(dtdUrl.toURI()))));

    // parse an XML document into a DOM tree
    DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    URL xmlUrl = XmlUtils.class.getClassLoader().getResource(xmlFile);
    System.out.println("XML:\n" + new String(Files.readAllBytes(Paths.get(xmlUrl.toURI()))));

    Document document = parser.parse(xmlUrl.openStream());

    // create a SchemaFactory capable of understanding WXS schemas
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

    // load a WXS schema, represented by a Schema instance
    Reader dtdReader = new URLReader(dtdUrl);
    Source schemaFile = new StreamSource(dtdReader);

    Schema schema = factory.newSchema(schemaFile);
    // create a Validator instance, which can be used to validate an instance document
    Validator validator = schema.newValidator();

    // validate the DOM tree
    validator.validate(new DOMSource(document));
}

的System.out:

DTD:
<!ELEMENT properties (property)*>
        <!ELEMENT property (#PCDATA)>
XML:
<?xml version="1.0" encoding="UTF-8"?>
<properties>
    <property>key1=value1</property>
</properties>
Exception in thread "main" org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 3;
The markup in the document preceding the root element must be well-formed.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper
    .createSAXParseException(ErrorHandlerWrapper.java:203)

1 个答案:

答案 0 :(得分:1)

您正在尝试将DTD用作XML Schema(XSD)。它不是XML Schema,它是一个DTD。

XML Schema本身就是一个XML文档。出现错误是因为您的DTD无法解析为XML文档,因此也不能将其解析为XML架构。

请参阅示例this answer,了解如何针对DTD验证XML文档。