Разбор XML с использованием XmlPullParser - PullRequest
1 голос
/ 05 ноября 2011

Я работаю с Android и использую xmlpullparser в Android для анализа XML-документа, который выглядит как:

<spaces>
  <space>
    <name></name>
    <desc></desc>
    <songs>
      <song>
        <name></name>
        <thumb></thumb>
      </song>
      <song>
        <name></name>
        <thumb></thumb>
      </song>
    </songs>
  </space>
</spaces>

использую это:

public List<Space> parse(String xmlString) {
        List<Space> Spaces = null;
        XmlPullParser parser = Xml.newPullParser();
        try {
            parser.setInput(new StringReader(xmlString));
            int eventType = parser.getEventType();
            Space currentSpace = null;
            boolean done = false;
            while (eventType != XmlPullParser.END_DOCUMENT && !done) {
                String name = null;
                switch (eventType) {
                case XmlPullParser.START_DOCUMENT:
                    Spaces = new ArrayList<Space>();
                    break;
                case XmlPullParser.START_TAG:
                    name = parser.getName();
                    if (name.equalsIgnoreCase("space")) {
                        currentSpace = new Space();
                        System.out.println("space");

                    } else if (currentSpace != null) {

                        if (name.equalsIgnoreCase("name")) {
                            currentSpace.setName(parser.nextText());
                            System.out.println(":::"+currentSpace.getName());

                        } else if (name.equalsIgnoreCase("id")) {
                            if (currentSpace.getId() == null) {
                                currentSpace.setId(parser.nextText());
                            }

                        }

                    }

                    break;
                case XmlPullParser.END_TAG:
                    name = parser.getName();
                    if (name.equalsIgnoreCase("space") && currentSpace != null) {
                        Spaces.add(currentSpace);

                    } else if (name.equalsIgnoreCase("spaces")) {
                        done = true;

                    }
                    break;
                }
                eventType = parser.next();  
            }
        } catch (Exception e) {
            Log.e("Projects List", e.getMessage(), e);
            throw new RuntimeException(e);
        }
        return Spaces;
    }

Моя проблема в том, что я хочу только <name></name>, который находится в <space>, а не в <song>, и используя вышеуказанный код, я получаю оба.

Я посмотрел Синтаксический анализ XML XmlPullParser android , но я не получил мое решение.

Пожалуйста, ответьте. Спасибо.

Ответы [ 2 ]

4 голосов
/ 05 ноября 2011

при синтаксическом анализе START_TAG, когда вы анализируете тег <space>, возьмите одну переменную-счетчик и присвойте ей 1, а затем всякий раз, когда вы получаете тег <name>, увеличивайте его на 1.

Теперь, при синтаксическом анализе тега <name>, просто проверьте, появляется ли тег <name> в первый раз, если он затем анализирует требуемое значение.

case XmlPullParser.START_TAG:
                    name = parser.getName();
                    if (name.equalsIgnoreCase("space")) {
                        cnt=1;
                        currentSpace = new Space();
                        System.out.println("space");

                    } else if (currentSpace != null) {

                        if (name.equalsIgnoreCase("name")) 
                         {
                            currentSpace.setName(parser.nextText());
                            if(cnt==1)
                            {
                                // you have <name> from <space>
                            }
                            System.out.println(":::"+currentSpace.getName());
                            cnt++;
                        } else if (name.equalsIgnoreCase("id")) {
                            if (currentSpace.getId() == null) {
                                currentSpace.setId(parser.nextText());
                            }

                        }

                    }

                    break;
2 голосов
/ 05 ноября 2011

Вы можете использовать FLAG и инициализировать его значение как false. Когда вы впервые вводите тег имени, проверяете на ложность, а когда вы попадаете в тег, тогда установите его значение в true. Тогда он не войдет снова.

...