2016-09-29 144 views
0

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

一切似乎都是正确的,并且当我将dtd嵌入到xml中时,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

您正在尝试使用您的DTD,就好像它是XML Schema(XSD)。这不是一个XML Schema,它是一个DTD。

XML模式本身就是一个XML文档。出现错误是因为您的DTD不能被解析为XML文档,因此也不能被解析为XML Schema。

有关如何根据DTD验证您的XML文档,请参阅this answer