【问题标题】:Read file from xml folder Android从xml文件夹Android读取文件
【发布时间】:2013-12-17 13:38:54
【问题描述】:

我需要从我的 xml 文件夹中读取一个 xml 文件,但我是 getting no such file 错误。谁能告诉我如何从 android 的 xml 文件夹中读取 XML 文件?

这是我的代码:

InputSource inputSource = new InputSource(getResources().openRawResource(
                 getResId("R.xml." + fileName.substring(0,fileName.length() - 4),
                 AlbumDetails.class)));

和logCat输出:

12-17 14:32:59.513: W/System.err(3563): java.lang.NoSuchFieldException: R.xml.quran_simple
12-17 14:32:59.513: W/System.err(3563):     at java.lang.Class.getDeclaredField(Class.java:631)
12-17 14:32:59.513: W/System.err(3563):     at com.darkovski.quran.AlbumDetails.getResId(AlbumDetails.java:250)
12-17 14:32:59.513: W/System.err(3563):     at com.darkovski.quran.AlbumDetails$3.doInBackground(AlbumDetails.java:282)
12-17 14:32:59.513: W/System.err(3563):     at com.darkovski.quran.AlbumDetails$3.doInBackground(AlbumDetails.java:1)
12-17 14:32:59.513: W/System.err(3563):     at android.os.AsyncTask$2.call(AsyncTask.java:264)
12-17 14:32:59.513: W/System.err(3563):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-17 14:32:59.513: W/System.err(3563):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-17 14:32:59.513: W/System.err(3563):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
12-17 14:32:59.513: W/System.err(3563):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-17 14:32:59.513: W/System.err(3563):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-17 14:32:59.513: W/System.err(3563):     at java.lang.Thread.run(Thread.java:856)
12-17 14:32:59.513: W/ResourceType(3563): No known package when getting value for resource number 0xffffffff
12-17 14:32:59.513: W/dalvikvm(3563): threadid=16: thread exiting with uncaught exception (group=0x2b542210)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563): 17-12-13 14:32:59:524 Unexpected problem on thread AsyncTask #3: An error occured while executing doInBackground()
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563): 17-12-13 14:32:59:530 java.lang.RuntimeException: An error occured while executing doInBackground()
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at android.os.AsyncTask$3.done(AsyncTask.java:278)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at java.lang.Thread.run(Thread.java:856)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563): Caused by: android.content.res.Resources$NotFoundException: Resource ID #0xffffffff
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at android.content.res.Resources.getValue(Resources.java:1018)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at android.content.res.Resources.openRawResource(Resources.java:943)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at android.content.res.Resources.openRawResource(Resources.java:925)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at com.darkovski.quran.AlbumDetails$3.doInBackground(AlbumDetails.java:281)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at com.darkovski.quran.AlbumDetails$3.doInBackground(AlbumDetails.java:1)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at android.os.AsyncTask$2.call(AsyncTask.java:264)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-17 14:32:59.523: E/Burstly SDK v.1.34.0.46238 BackgroundUncaughtExceptionHandler(3563):  ... 5 more

【问题讨论】:

    标签: android android-asynctask android-xml android-resources


    【解决方案1】:

    如果你需要一个输入流,只需将 xml 放入原始资源并用

    打开它

    InputStream inputStream = getResources().openRawResource(R.raw.fileName);

    【讨论】:

    • 这是否意味着我应该将文件移动到raw 文件夹?
    • 是的,我需要输入流,所以只是为了澄清将 xml 文件从 XML 文件夹复制到原始文件夹对吗?
    【解决方案2】:

    在 res/ 文件夹中所有的 xml 文件都是预编译的,而在 assets/ 文件夹中它们不是。

    所以使用这个你想从 res 文件夹中解析它

    XmlResourceParser xrp = ctx.getAssets().openXmlResourceParser("res/xml/castle1.tmx");
    

    否则 使用可以使用

    InputStream object = this.getResources()
                     .openRawResource(R.raw.fileName);
    

    【讨论】:

      【解决方案3】:

      如果你真的需要源文本,它应该这样工作:

      (使用 XmlResourceParser)

      @Throws(IOException::class, XmlPullParserException::class)
      fun readXML(context: Context, idRes: Int): String? {
          return if (idRes != View.NO_ID)
              context.resources.getXml(idRes).getAllXML()
          else
              null
      }
      
      @Throws(IOException::class, XmlPullParserException::class)
      fun XmlResourceParser.getAllXML(): String {
          var str = ""
          var eventType = eventType
          while (eventType != XmlPullParser.END_DOCUMENT) {
              if (eventType == XmlPullParser.START_TAG) {
                  str += "<${name}"
                  for (i in 0..attributeCount) {
                      val attrName = getAttributeName(i)
                      val attrValue = getAttributeValue(i)
                      str += "${attrName}=\"${attrValue}\""
                  }
                  str += ">"
                  str += nextText()
              }
              if (eventType == XmlPullParser.CDSECT) {
                  str += "<![CDATA[${nextText()}]]>"
              }
              if (eventType == XmlPullParser.END_TAG) {
                  str += "</${name}>"
              }
              eventType = next()
          }
          return str
      }
      

      【讨论】:

        【解决方案4】:
        InputStream is = getResources().getAssets().open("abc.txt");
        String result= convertStreamToString(is);
        
        public static String convertStreamToString(InputStream is)
                throws IOException {
                Writer writer = new StringWriter();
            char[] buffer = new char[2048];
            try {
                Reader reader = new BufferedReader(new InputStreamReader(is,
                        "UTF-8"));
                int n;
                while ((n = reader.read(buffer)) != -1) {
                    writer.write(buffer, 0, n);
                }
            } finally {
                is.close();
            }
            String text = writer.toString();
            return text;
        }
        

        在此代码中.. 使用您的文件夹而不是“assets”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-19
          • 2014-06-22
          • 2019-02-17
          相关资源
          最近更新 更多