2012-01-02 106 views
12

我有下面的XML文件:如何使用java验证xml与dtd?

<?xml version = "1.0" ?> 
<Employee> 
<Emp_Id> E-001</Emp_Id> 
<Emp_Name> Vinod </Emp_Name> 
<Emp_E-mail> [email protected] </Emp_E-mail> 
</Employee> 

我有以下DTD文件:

<!ELEMENT Employee (Emp_Id, Emp_Name, Emp_E-mail)> 
<!ELEMENT Emp_Id (#PCDATA)> 
<!ELEMENT Emp_Name (#PCDATA)> 
<!ELEMENT Emp_E-mail (#PCDATA)> 

我想验证上面的DTD用java这个XML文件。

请帮助感谢.. :-)

回答

18

有三件事情你应该做的:

  • 使用doctype声明将源XML文档与其DTD关联起来 XML声明:

    <!DOCTYPE Employee SYSTEM "employee.dtd"> 
    

    :该DOCTYPE根必须在源XML根元素相匹配。

    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
    domFactory.setValidating(true); 
    DocumentBuilder builder = domFactory.newDocumentBuilder(); 
    builder.setErrorHandler(new ErrorHandler() { 
        @Override 
        public void error(SAXParseException exception) throws SAXException { 
         // do something more useful in each of these handlers 
         exception.printStackTrace(); 
        } 
        @Override 
        public void fatalError(SAXParseException exception) throws SAXException { 
         exception.printStackTrace(); 
        } 
    
        @Override 
        public void warning(SAXParseException exception) throws SAXException { 
         exception.printStackTrace(); 
        } 
    }); 
    Document doc = builder.parse("employee.xml"); 
    

    源文件:

  • setValidatingtrueDocumentBuilderFactory

  • 使用setErrorHandler

这里有一个完整的例子提供一个org.xml.sax.ErrorHandler实例到DocumentBuilder

<?xml version="1.0"?> 
<!DOCTYPE Employee SYSTEM "employee.dtd"> 
<Employee> 
    <Emp_Id> E-001</Emp_Id> 
    <Emp_Name> Vinod </Emp_Name> 
    <Emp_E-mail> [email protected] </Emp_E-mail> 
</Employee> 
+0

谢谢lwburk!但我不允许在原始源XML文件中更改。 – 2012-01-04 04:41:32

+3

@SachinJ - 将文件读入内存,插入DOCTYPE行,使构建器解析XML字符串而不是磁盘文件。 – 2015-08-11 01:11:53

1

你只需要阅读的文件,如果有,报告的异常。这是你可以信赖的SAX parser example

为了验证你的XML和DTD你只需要的setValidating:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setValidating(true); // since the default value is false 

而且声明DTD使用的XML文件:

<?xml version="1.0"?> 
<!DOCTYPE Employee SYSTEM "employee.dtd"> 
<Employee> 
+2

*文档根元素“Employee”,必须匹配DOCTYPE根“employee”。* – 2012-01-03 19:37:26

+0

当然Employee!谢谢... – 2012-01-03 20:05:13

+0

+1 - 感谢您的修复。 – 2012-01-03 20:52:43