2012-01-02 144 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