警告:已启用验证但是启用了org.xml.sax.ErrorHandler

时间:2009-12-08 13:12:21

标签: java xml

知道为什么会发生这种错误以及如何修复它?我在尝试解析/加载配置文件时遇到此错误:

错误

Warning: validation was turned on but an org.xml.sax.ErrorHandler was not
set, which is probably not what is desired.  Parser will use a default
ErrorHandler to print the first 10 errors.  Please call
the 'setErrorHandler' method to fix this.
Error: URI=null Line=3: Document root element "persistence", must match DOCTYPE root "null".
Error: URI=null Line=3: Document is invalid: no grammar found.
null
[]
null

主要代码

public static void main(String[] args) throws ConfigurationException {
        config = new XMLPropertiesConfiguration(new File("META-INF/vamola.xml"));                                                                                                                                   
        System.out.println(config.getString("persitence-unit.provider"));
        System.out.println(config.getList("persistence-unit.properties.name"));

    }

XML文件

<?xml version="1.0"?>
<persistence version="1.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="dbBank" transaction-type="RESOURCE_LOCAL">
        <provider>oracle.toplink.essentials.PersistenceProvider</provider>

        <class>br.ufg.inf.server.Account</class>
        <class>br.ufg.inf.server.UserBank</class>

        <properties>
            <property name="toplink.jdbc.user" value="derby" />
            <property name="toplink.jdbc.password" value="senha" />
            <property name="toplink.jdbc.url" value="jdbc:derby://192.168.80.125:1527/db/master/dbBank;create=true"/>
            <property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver" />
            <property name="toplink.ddl-generation" value="create-tables" />
            <property name="toplink.logging.level" value="OFF" />
            <property name="toplink.target-database" value="Derby" />
        </properties>
    </persistence-unit>
</persistence> 

3 个答案:

答案 0 :(得分:4)

如果解析了启用了验证的XML文档,则需要在XML文档开头的DOCTYPE中指定DTD或XML架构。您的解析器基本上抱怨它不知道如何验证您的文档,因为没有指定语法来验证标记。

您已经拥有XML架构,因此您可能需要:

<!DOCTYPE schema PUBLIC "http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

如果要关闭验证,则需要以下内容:

spf.setValidating(false);(其中spf是SaxParserFactory)

答案 1 :(得分:4)

例外情况表明未设置ErrorHandler。这意味着解析器使用其内置的错误处理程序,它只是将消息写入控制台。如果您确实要验证,则需要创建ErrorHandler实施并将其附加到DocumentBuilder

有关更多信息,请阅读:http://www.kdgregory.com/index.php?page=xml.parsing(错误处理程序大约是传输方式的1/3)。

或者,正如其他回复建议的那样,您可以关闭验证。

答案 2 :(得分:0)

XML文档定义了默认命名空间http://java.sun.com/xml/ns/persistence并包含一个url,其中可以找到模式(xsi:schemaLocation属性,第一个值是命名空间,第二个是url或路径)。

请仔细检查解析时是否可以访问此网址。另一种方法是下载模式,将其放在文件系统上并修改xsi:schemaLocation值。