如何使用Java验证XML并使用DTD进行验证?

16

我有以下的xml文件:

<?xml version = "1.0" ?>
<Employee>
    <Emp_Id>E-001</Emp_Id>
    <Emp_Name>Vinod</Emp_Name>
    <Emp_E-mail>Vinod1@yahoo.com</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)>

我想使用Java验证此XML文件并使用上述DTD。

请帮忙,谢谢..:-)

2个回答

20

你需要做三件事:

  • Associate the source XML document with its DTD using a doctype declaration after the XML declaration:

    <!DOCTYPE Employee SYSTEM "employee.dtd">
    

    Note: The DOCTYPE root must match the root element in the source XML.

  • setValidating to true on the DocumentBuilderFactory

  • Provide an org.xml.sax.ErrorHandler instance to the DocumentBuilder using setErrorHandler

这是一个完整的示例:
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");

源文件:

<?xml version="1.0"?>
<!DOCTYPE Employee SYSTEM "employee.dtd">
<Employee>
    <Emp_Id> E-001</Emp_Id>
    <Emp_Name> Vinod </Emp_Name>
    <Emp_E-mail> Vinod1@yahoo.com </Emp_E-mail>
</Employee>

谢谢lwburk!! 但我不允许更改原始的源XML文件。 - Sachin J
4
将文件读入内存,插入DOCTYPE行,让解析器解析XML字符串而不是磁盘文件。 - Jesse Chisholm
抱歉问一下,我应该在哪里设置文件路径为“SYSTEM”的DTD文件路径? - Tobia

1

你只需要读取文件并报告异常(如果有的话)。这里有一个SAX解析器示例可以供您使用。

为了验证您的XML和DTD,您只需要设置Validating属性:

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

同时在你的XML文件中声明DTD的使用:

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

2
文档根元素“Employee”必须匹配DOCTYPE根“employee”。 - Wayne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接