我正在尝试使用以下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)
答案 0 :(得分:1)
您正在尝试将DTD用作XML Schema(XSD)。它不是XML Schema,它是一个DTD。
XML Schema本身就是一个XML文档。出现错误是因为您的DTD无法解析为XML文档,因此也不能将其解析为XML架构。
请参阅示例this answer,了解如何针对DTD验证XML文档。