【问题标题】:How to validate xml with dtd using java?java - 如何使用java验证带有dtd的xml?
【发布时间】:2021-07-18 15:44:48
【问题描述】:

我有以下 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)>

我想用上面的 dtd 使用 java 来验证这个 xml 文件。

请帮忙谢谢..:-)

【问题讨论】:

    标签: java xml dtd


    【解决方案1】:

    你应该做三件事:

    • 在 XML 声明之后使用 doctype 声明将源 XML 文档与其 DTD 相关联:

      <!DOCTYPE Employee SYSTEM "employee.dtd">
      

      注意:DOCTYPE 根必须与源 XML 中的根元素匹配。

    • setValidatingtrue DocumentBuilderFactory

    • 使用setErrorHandlerDocumentBuilder 提供org.xml.sax.ErrorHandler 实例

    这是一个完整的例子:

    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 文件。
    • @SachinJ - 将文件读入内存,插入 DOCTYPE 行,让构建器解析 XML 字符串而不是磁盘文件。
    • 抱歉这个问题,但是......我应该在哪里设置文件集的DTD文件路径为“SYSTEM”?
    【解决方案2】:

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

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

        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>
    

    【讨论】:

    • 文档根元素“Employee”,必须匹配 DOCTYPE 根“employee”。
    猜你喜欢
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2015-12-17
    • 2016-09-18
    相关资源
    最近更新 更多