Нужна помощь в чтении XML-файла

1

Я создал папку xml под res и поместил myxml.xml в папку xml. Рез /XML/myxml.xml

Я хочу прочитать описание в соответствии с номером id. Как я могу это достичь? Пожалуйста, помогите.

myxml.xml выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<Books>
  <Number id ="1">
    <Description>This is childrens book.
    </Description>
  </Number> 
  <Number id = "2">
    <Description>This is about cooking.
   </Description>
</Books>

Вот код, с которым я работаю (но, похоже, ничего не делает)

try{
        XmlPullParser xpp = getResources().getXml(R.xml.myxml);
                while(xpp.getEventType() != XmlPullParser.END_DOCUMENT){
            if(xpp.getEventType() == XmlPullParser.START_TAG){ 
              if(xpp.getName().equals("Description")){

                  show1.setText(" " + xpp.getAttributeValue(1));
              }
            }
        xpp.next();
         }
        }
        catch(Throwable t){

        }
  • 3
    Пожалуйста, не продолжайте публиковать повторяющиеся вопросы. Я объединил их с этим, вашим оригиналом, который вы можете редактировать для предоставления дополнительной информации.
Теги:

9 ответов

2

Как это будет работать, если в нем нет нулевого значения. u r doin null.getResources();

  • 0
    .. это было легко;) хороший улов!
2

Для чего вы пытаетесь достичь здесь, я бы рекомендовал использовать javax.xml.xpath. Взятый из примера на этой странице, адаптированный к вашему XML файлу (XPath здесь получит описание Number с атрибутом id из 2):

XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "//Number[@id='2']/Description";

try {
    InputSource inputSource = new InputSource(activity.getResources().openRawResource(R.raw.myxml));
    Node node = (Node) xpath.evaluate(expression, inputSource, XPathConstants.NODE);
    String description = node.getTextContent();
} catch (Exception e) {
    Log.d("ParseException", e.toString());
}

Я немного обновил этот пример, чтобы загрузить InputSource из потока ресурсов. Для этого вам кажется, что вам нужно поместить ваш xml файл в папку res/raw, а не res/xml (на основе этого ответа: проблема загрузки и анализа XML из ресурсов). Я также должен был сделать проект > чистым, чтобы заставить это работать.

Вероятно, вы также захотите обработать ошибку исключения разбора немного лучше!

  • 0
    Я добавил в приведенный выше код textview.setText ("" + description), но он ничего не отображает из XML-файла. Есть идеи? Я ценю вашу помощь в этом.
  • 0
    Эй, я немного обновил пример - надеюсь, теперь он должен работать правильно. Дайте мне знать, если у вас есть еще проблемы.
1

Причина, по которой он не работает, заключается в том, что вы вызываете метод xrp.getName(), когда текущий eventType равен XmlPullParser.TEXT.

В соответствии с документацией:

public abstract String getName()

События START_TAG или END_TAG... Если текущее событие не START_TAG, END_TAG или ENTITY_REF, null вернулся.

Я бы создал Stack<String> для хранения имен элемента, в котором я сейчас. Когда я доберусь до начального тега, я бы нажал имя на верх, и когда я нахожусь в конце тега, я бы назвал это имя сверху. Таким образом, когда я в текстовом элементе, я бы знал весь xPath моего текущего местоположения.

1

вы можете использовать это, я уверен, что это поможет вам

XmlResourceParser pars = res.getXml(R.xml.myxml);
while (pars.getEventType() != XmlResourceParser.END_DOCUMENT) {
    if (pars.getEventType() == XmlResourceParser.START_TAG) {
              if(pars.getName().equals("Number")) {
                   int id = pars.getAttributeIntValue(null, "id", 0);
              }
        }
    pars.next();
}
pars.close();

в вашем Xml вы забыли положить / в свой тег Number

<Number id ="1" />

используйте эту ссылку, чтобы понять XmlResourceParser, она проста в использовании http://www.anddev.org/using_xmlresourceparser_to_parse_custom_compiled_xml-t9313.html

  • 0
    Спасибо, Джордж. Я попробовал приведенный выше код, он отображает «2», так как это последний элемент в XML-файле. Как я могу отобразить описание в editText с соответствующим идентификатором.
0

Я не думаю, что какое-либо из ваших условий "если" становится удовлетворительным. Верните строку, которая не пуста, и посмотрите, отображается ли она. Если да, то переосмыслите свою логику для метода getEventsFromAnXML.

0

Вероятно, у вас есть непредвиденная ситуация, и ваша программа выдает исключение и умирает.

Найдите трассировку печатного стека и добавьте ее в свой вопрос. Это, скорее всего, скажет вам, почему. Очень распространенная причина состоит в том, чтобы иметь неинициализированные переменные, которые затем пытаются вызвать метод при предоставлении исключения NullPointerException.

0

Проблема заключается в том, что вы не можете получить доступ к ресурсам APK, как они находятся на пути, потому что они скомпилированы в ваше приложение. Если вы хотите получить доступ к ресурсу напрямую, попробуйте следующее:

InputStream inputStream = context.getResources().openRawResource(R.xml.myxml);
InputSource inputSource = new InputSource(inputStream);

Вам может потребоваться переместить XML файл в папку res/raw/ и использовать R.raw.myxml для доступа к нему.

  • 0
    Он говорит, что «контекст» не может быть решен. Могу ли я использовать «это» вместо контекста. Спасибо
  • 0
    @artist Если вы занимаетесь чем-то интересным, то да, this должно работать нормально.
0

Я бы не использовал XPath для этого, XMLResourceParser -класс должен был это сделать (учебник).

0

В вашем примере я заметил, что в XML отсутствует тег закрытия </Number>, где атрибут id равен "2". Его возможная ошибка форматирования, такая как это может привести к вашей ошибке.

  • 0
    Эта ошибка не в коде. Является ли xmlPullParser правильным способом чтения XML-документа (новичок в Android). Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню