Подтвердить что ты не робот

Android: как загрузить xml файл из каталога ресурсов?

У меня проблема с загрузкой xml файла из каталога ресурсов. используя одну и ту же строку кода (просто изменяя путь), я получаю разные результаты (либо нормально, либо NPE/файл поврежден) файл "castle1.tmx" (это файл xml) копируется в двух местах:

  • Рез /XML/castle 1.tmx
  • активы/уровень/castle1.tmx

с этой строкой, он работает:

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

в то время как в этой строке это не так:

XmlResourceParser xrp = ctx.getAssets().openXmlResourceParser("assets/level/castle1.tmx");

я получаю следующий результат:

04-05 21:46:40.940: WARN/ResourceType(29056): Bad XML block: header size 28024 or total size 1702240364 is larger than data size 70441
04-05 21:46:40.940: ERROR/TestParser(29056): Unable to read resource file
04-05 21:46:40.940: WARN/System.err(29056): java.io.FileNotFoundException: Corrupt XML binary file
04-05 21:46:40.940: WARN/System.err(29056):     at android.content.res.AssetManager.openXmlAssetNative(Native Method)
04-05 21:46:40.944: WARN/System.err(29056):     at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:485)
04-05 21:46:40.944: WARN/System.err(29056):     at android.content.res.AssetManager.openXmlResourceParser(AssetManager.java:453)
04-05 21:46:40.944: WARN/System.err(29056):     at android.content.res.AssetManager.openXmlResourceParser(AssetManager.java:442)
04-05 21:46:40.944: WARN/System.err(29056):     at game.test.MapLoader.<init>(MapLoader.java:73)
Файл

находится в обоих случаях... это просто, что я, похоже, не могу прочитать его из каталога ресурсов, используя этот метод.

любые идеи, как я могу загрузить мой xml файл из каталога ресурсов?

TNX

4b9b3361

Ответ 1

В папке res/ все файлы xml предварительно скомпилированы, а в папке assets/ - нет. Таким образом, вы не можете использовать openXmlResourceParser() с не прекомпилированными ресурсами. Вместо этого используйте open() и прочитайте файл через InputStream.

Ответ 2

i удалось выполнить загрузку и анализ моего xml файла из каталога ресурсов (assets/level/castle1.tmx)

вот что я сделал:

заменил это:

  XmlResourceParser xrp = ctx.getResources().getXml(ctx.getResources().getIdentifier(name, "xml", ctx.getPackageName()));

:

  InputStream istr = context.getAssets().open("level/"+name+".tmx");
  XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
  factory.setNamespaceAware(true); 
  xrp = factory.newPullParser(); 
  xrp.setInput(istr, "UTF-8");  

тогда все, что я должен был сделать, это редактировать некоторые строки getAttributeIntValue():

  int a = xrp.getAttributeIntValue(null, "width",0));

в это:

  int a = Integer.parseInt(xrp.getAttributeValue(null, "width"));

и все остальное работало без изменений:) Этот класс предназначен для синтаксического анализа файлов xml/map для создания уровней игры. раньше, он работал с использованием res/, но я хотел попытаться поместить все мои файлы в активы/вместо этого. так что теперь это работает:)

спасибо за помощь

Ответ 4

Причина в том, что вы пытаетесь загрузить двоичный XML файл (ваша ошибка равна java.io.FileNotFoundException: Corrupt XML binary file).

Все файлы Android (макеты, строки и т.д.), хранящиеся в res, автоматически скомпилируются в двоичный XML при компиляции вашего проекта. XML файлы в активах рассматриваются как стандартные XML файлы и поэтому не компилируются в двоичный XML.

Вкратце: файлы Android XML должны находиться в папке res. Вы можете хранить только текстовый XML файл в папке с ресурсами (а не файлы макета и т.п.).