【问题标题】:XML Schema validation using xerces for Android使用 xerces for Android 进行 XML Schema 验证
【发布时间】:2013-09-02 01:53:58
【问题描述】:

我正在尝试根据 XML Schema 文件验证 XML 文件,并且我已经下载了 https://code.google.com/p/xerces-for-android/ 库以使 XML Schema 验证正常工作,并且我已将项目创建为库。我无法让它在 Android 上正常工作,我收到“FileNotFoundException”错误,如果有人能看到我做错了什么或者我需要做什么才能让它工作,那么请你帮帮我。

代码如下:

public void xmlValidator() throws IOException, SAXException
{
    Source schemaFile = new StreamSource(new File("device_description_schema.xsd"));
    Source xmlFile = new StreamSource(new File("device_description.xml"));
    SchemaFactory schemaFactory = new XMLSchemaFactory();
    Schema schema = schemaFactory.newSchema(schemaFile);
    Validator validator = schema.newValidator();
    try {
      validator.validate(xmlFile);
      System.out.println(xmlFile.getSystemId() + " is valid");
    } catch (SAXException e) {
      System.out.println(xmlFile.getSystemId() + " is NOT valid");
      System.out.println("Reason: " + e.getLocalizedMessage());
    }
}

这里是 logcat 错误:

08-29 15:05:09.461: W/System.err(14294): java.io.FileNotFoundException: /device_description_schema.xsd: open failed: ENOENT (No such file or directory)
08-29 15:05:09.461: W/System.err(14294):    at mf.org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:197)
08-29 15:05:09.461: W/System.err(14294):    at mf.org.apache.xerces.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:133)
08-29 15:05:09.461: W/System.err(14294):    at mf.org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:395)
08-29 15:05:09.461: W/System.err(14294):    at mf.org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:305)
08-29 15:05:09.461: W/System.err(14294):    at mf.org.apache.xerces.impl.xs.traversers.XSDHandler.reportSchemaError(XSDHandler.java:4098)
08-29 15:05:09.461: W/System.err(14294):    at mf.org.apache.xerces.impl.xs.traversers.XSDHandler.getSchemaDocument1(XSDHandler.java:2452)
08-29 15:05:09.461: W/System.err(14294):    at mf.org.apache.xerces.impl.xs.traversers.XSDHandler.getSchemaDocument(XSDHandler.java:2161)
08-29 15:05:09.461: W/System.err(14294):    at mf.org.apache.xerces.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:558)
08-29 15:05:09.461: W/System.err(14294):    at mf.org.apache.xerces.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:582)
08-29 15:05:09.461: W/System.err(14294):    at mf.org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:549)
08-29 15:05:09.461: W/System.err(14294):    at mf.org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:515)
08-29 15:05:09.461: W/System.err(14294):    at mf.org.apache.xerces.jaxp.validation.XMLSchemaFactory.newSchema(XMLSchemaFactory.java:237)
08-29 15:05:09.461: W/System.err(14294):    at mf.javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:611)
08-29 15:05:09.461: W/System.err(14294):    at com.example.mobileapplicationretry.generalclasses.ValidateXml.xmlValidator(ValidateXml.java:49)
08-29 15:05:09.461: W/System.err(14294):    at com.example.mobileapplicationretry.MainActivity.onCreate(MainActivity.java:52)
08-29 15:05:09.461: W/System.err(14294):    at android.app.Activity.performCreate(Activity.java:5133)
08-29 15:05:09.461: W/System.err(14294):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
08-29 15:05:09.461: W/System.err(14294):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
08-29 15:05:09.461: W/System.err(14294):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
08-29 15:05:09.461: W/System.err(14294):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
08-29 15:05:09.461: W/System.err(14294):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
08-29 15:05:09.461: W/System.err(14294):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-29 15:05:09.461: W/System.err(14294):    at android.os.Looper.loop(Looper.java:137)
08-29 15:05:09.461: W/System.err(14294):    at android.app.ActivityThread.main(ActivityThread.java:5103)
08-29 15:05:09.461: W/System.err(14294):    at java.lang.reflect.Method.invokeNative(Native Method)
08-29 15:05:09.461: W/System.err(14294):    at java.lang.reflect.Method.invoke(Method.java:525)
08-29 15:05:09.461: W/System.err(14294):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
08-29 15:05:09.461: W/System.err(14294):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-29 15:05:09.461: W/System.err(14294):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android xml validation xsd xerces


    【解决方案1】:

    /device_description_schema.xsd: open failed: ENOENT (No such file or directory)

    请检查文件的路径。

    如果你的文件存放在这里,使用Environment.getExternalStorageDirectory()获取sdcard的路径

    希望对你有帮助

    编辑:使用getResources().openRawResource(R.raw.filename) 获取 /res/raw 下文件的 InputStream

    【讨论】:

    • 我只有文件存储在 res/raw/ 下的项目文件夹中。我觉得我在这里做的有点不对,它正在设备上寻找文件,显然它不存在。我应该如何解决这个问题?
    • 我试过了,它不会检测到原始文件夹中的文件。我应该尝试再次创建文件夹还是有其他方法?
    • 如果做ctrl+space avec写R.raw,文件会出现吗?
    • 不,它根本没有出现。出现的唯一选项是“class”和“this”。
    • 尝试清洁和刷新:)
    【解决方案2】:

    对于 Android,您必须将文件放入 assets 目录并使用 Android 上下文打开文件:

    Context myAndroidContext;
    ...
    final Source xsdSource = new StreamSource(myContext.getAssets().open(
                    FOLDER  + File.separator + xsdFileName));
    ...
    
    // FOLDER into assets if you need
    

    【讨论】:

      猜你喜欢
      • 2014-03-27
      • 2018-04-10
      • 2012-08-24
      • 1970-01-01
      • 2011-05-31
      • 2014-01-16
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多