【问题标题】:XML Schema Validation in Android - getting "java.lang.ExceptionInInitializerError"Android 中的 XML 模式验证 - 获取“java.lang.ExceptionInInitializerError”
【发布时间】:2013-05-21 19:47:18
【问题描述】:

我已经搜索了,我已经搜索了,但我不知道出了什么问题。我知道标准的 Android 库不支持 Schema 或 xml 验证,而且您不能开箱即用地使用 Apache Xerces,所以我使用了这个库: https://code.google.com/p/xerces-for-android/

人们似乎在这个库上取得了成功,但我没有。这是我的代码:

private boolean validateDocument() {

    boolean result;

    try {

        InputStream is = context.getResources().openRawResource(R.raw.xml_schema);
        File file = context.getFileStreamPath(fileName);

        Source schemaFile = new StreamSource(is);
        Source xmlFile = new StreamSource(file);

        SchemaFactory factory = new XMLSchemaFactory();
        Schema schema = factory.newSchema(schemaFile);

        Validator validator = schema.newValidator();

        validator.validate(xmlFile);

        result = true;
    } catch (SAXException e) {
        result = false;
        e.printStackTrace();
    } catch (IOException ie) {
        result = false;
        ie.printStackTrace();
    }

    return result;

}

我不确定我的 xml_schema 文件是否正确,但这似乎不是问题。无论如何,这里是:

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="manifest" type="ManifestType" />

    <xs:complexType name="ManifestType" >
        <xs:sequence>
            <xs:element name="base_url" type="BaseUrl" maxOccurs="1" />
            <xs:element name="current_version" type="CurrentVersion" maxOccurs="1" />
            <xs:element name="version" type="VersionType" minOccurs="1" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="BaseUrl" >
        <xs:attribute name="url" type="xs:string" use="required" />
    </xs:complexType>

    <xs:complexType name="CurrentVersion" >
        <xs:attribute name="id" type="xs:string" use="required" />
        <xs:attribute name="zip_url" type="xs:string" use="required" />
        <xs:attribute name="build_md5" type="xs:boolean" use="required" />
    </xs:complexType >

    <xs:complexType name="VersionType" >
        <xs:sequence >
            <xs:element name="file" type="FileType" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="add" type="AddType" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="remove" type="RemoveType" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="id" type="xs:string" use="required" />
        <xs:attribute name="build_md5" type="xs:string" />
        <xs:attribute name="prefix" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="FileType" >
        <xs:attribute name="path" type="xs:string" use="required" />
        <xs:attribute name="url" type="xs:string" />
        <xs:attribute name="md5" type="xs:string" />
        <xs:attribute name="patch" type="xs:string" />
        <xs:attribute name="file" type="xs:string" use="required" />
        <xs:attribute name="name" type="xs:string" use="required" />
        <xs:attribute name="permissions" use="required" >
            <xs:simpleType>
                <xs:restriction base="xs:integer" >
                    <xs:minInclusive value="0" />
                    <xs:maxInclusive value="777" />
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="AddType" >
        <xs:attribute name="path" type="xs:string" use="required" />
        <xs:attribute name="url" type="xs:string" />
        <xs:attribute name="file" type="xs:string" use="required" />
        <xs:attribute name="name" type="xs:string" use="required" />
        <xs:attribute name="permissions" use="required" >
            <xs:simpleType>
                <xs:restriction base="xs:integer" >
                    <xs:minInclusive value="0" />
                    <xs:maxInclusive value="777" />
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>

    <xs:complexType name="RemoveType" >
        <xs:attribute name="path" type="xs:string" use="required" />
        <xs:attribute name="name" type="xs:string" use="required" />
    </xs:complexType>

</xs:schema>

我没有应该验证的确切 XML 文件,但这是我用于测试的示例:

<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >

    <base_url url="https://whatever.com" />
    <current_version id="someversion"
                     zip_url="somedownloadurl.zip"
                     build_md5="true" />

    <version id="versionA" build_md5="md5sum" prefix="rom_update_version=" >
        <file path="path/of/example" url="https://someurl.com" md5="md5sum" patch="path/of/example/file.patch" file="path/of/example/file" name="file" permissions="645" />
        <file path="path/of/example2" md5="md5sum" patch="path/of/example2/file2.patch" file="path/of/example2/file2" name="file2" permissions="665" />

        <add path="path/of/example3" file="path/of/example3/file3" name="file3" permissions="333" />

        <remove path="path/of/example4" name="file4" />
    </version>

    <version id="versionB" build_md5="md5sum" prefix="rom_update_version=" >
        <file path="path/of/example" md5="md5sum" patch="path/of/example/file.patch" file="path/of/example/file" name="file" permissions="777" />
        <file path="path/of/example2" url="https://someurl.com" md5="md5sum" patch="path/of/example2/file2.patch" file="path/of/example2/file2" name="file2" permissions="775" />

        <add path="path/of/example3" file="path/of/example3/file3" name="file3" permissions="333" />

        <remove path="path/of/example4" name="file4" />
    </version>
</manifest>

这里是完整的例外:

Caused by: java.lang.ExceptionInInitializerError
    at mf.org.apache.xerces.impl.dv.SchemaDVFactory.getInstance(SchemaDVFactory.java:73)
    at mf.org.apache.xerces.impl.dv.SchemaDVFactory.getInstance(SchemaDVFactory.java:55)
    at mf.org.apache.xerces.impl.xs.XMLSchemaLoader.reset(XMLSchemaLoader.java:999)
    at mf.org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:536)
    at mf.org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:515)
    at mf.org.apache.xerces.jaxp.validation.XMLSchemaFactory.newSchema(XMLSchemaFactory.java:237)
    at mf.javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:611)
    at wav.demon.cognitionupdate.XMLRetriever.XMLParser.validateDocument(XMLParser.java:116)
    at wav.demon.cognitionupdate.XMLRetriever.XMLParser.<init>(XMLParser.java:78)
    at wav.demon.cognitionupdate.XMLRetriever.TestUpdate.doInBackground(TestUpdate.java:70)
    at wav.demon.cognitionupdate.XMLRetriever.TestUpdate.doInBackground(TestUpdate.java:28)
    at android.os.AsyncTask$2.call(AsyncTask.java:287)
    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
    ... 4 more

at wav.demon.cognitionupdate.XMLRetriever.XMLParser.validateDocument(XMLParser.java:116) 是我的代码的第一个,它是Schema schema = factory.newSchema(schemaFile); 行。

我已经搜索并搜索并搜索了此问题的解决方案,但我一无所知。我在任何地方看起来都好像我做得对,但这只是行不通。任何帮助将不胜感激。

【问题讨论】:

  • 你的 xml 文件无效
  • 架构文件还是测试xml文件?
  • 两者,检查我的答案。但是您应该立即标记 xml 无效:w3.org/2001/XMLSchema-instance" xsi="noNameSpaceSchemaLocation="xml_schema.xsd" >
  • 我明白了,几分钟前我在寻找解决方案时添加了该行;我没有看到错字。

标签: java android xsd xerces xml-validation


【解决方案1】:

你的 xml 数据/xml 方案我都试过了,它们都无效:

http://www.utilities-online.info/xsdvalidation/ 甚至 java 堆栈都这么说。

【讨论】:

  • 我不知道这个网站存在,我会调查一下。
  • 好的,我编辑了原始帖子以显示我的更改,xml 文件现在有效,根据您链接到的站点。不过,我收到了完全相同的错误消息。
  • 那时我不知道,我要检查的最后一件事是:您确定要引用所有 jar,并将它们添加到构建路径中吗?
  • 我不确定您的意思,但我使用的是 Android Studio,所有内容都已添加并编译正常。
  • 你确定吗? Android Studio 甚至都不是测试版,所以可能缺少一些东西。我要说的是,您直接调用的 xerces 库可能在 in 路径中,但它所依赖的其他库可能不是,因此在运行时出现错误。
猜你喜欢
  • 2010-10-25
  • 2011-06-02
  • 2010-11-22
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2010-12-07
  • 1970-01-01
相关资源
最近更新 更多