Android: как загрузить XML-файл из каталога активов? - PullRequest
16 голосов
/ 06 апреля 2011

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

  • Рез / XML / castle1.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-файл из каталога активов?

Тпй

Ответы [ 4 ]

18 голосов
/ 06 апреля 2011

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

16 голосов
/ 06 апреля 2011

мне удалось загрузить и проанализировать мой 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 /, но я хотел попробовать вместо этого поместить все мои файлы в assets /.так что теперь работает :)

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

4 голосов
/ 06 апреля 2011

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

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

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

3 голосов
/ 06 апреля 2011

Взгляните на

https://github.com/pilhuhn/TurtleCar/blob/master/src/de/bsd/turtlecar/Board.java#L30, который вызывается для примера https://github.com/pilhuhn/TurtleCar/blob/master/src/de/bsd/turtlecar/SampleView.java#L45

.

В основном вам нужно задать AssetManager для файла:

 AssetManager assetManager = context.getAssets();
    try {
        InputStream is = assetManager.open("1.xml");
       ....
...