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
Ответы
Ответ 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/, но я хотел попытаться поместить все мои файлы в активы/вместо этого.
так что теперь это работает:)
спасибо за помощь
Ответ 3
Посмотрите
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");
....
Ответ 4
Причина в том, что вы пытаетесь загрузить двоичный XML файл (ваша ошибка равна java.io.FileNotFoundException: Corrupt XML binary file
).
Все файлы Android (макеты, строки и т.д.), хранящиеся в res
, автоматически скомпилируются в двоичный XML при компиляции вашего проекта. XML файлы в активах рассматриваются как стандартные XML файлы и поэтому не компилируются в двоичный XML.
Вкратце: файлы Android XML должны находиться в папке res
. Вы можете хранить только текстовый XML файл в папке с ресурсами (а не файлы макета и т.п.).