Java обрабатывает XML с помощью SAX - PullRequest
1 голос
/ 01 мая 2011

У меня есть XML, мне нужно разобрать с заданной структурой:

<?xml version="1.0" encoding="UTF-8"?> 
<root>
  <tag label="idAd">
    <child label="text">Text</child>
  </tag>
  <tag label="idNumPage">
    <child label1="text" label2="text">Text</child>
  </tag>
</root>

Я использую SAX-парсер для его анализа:

RootElement root=new RootElement("root");
android.sax.Element page_info=root.getChild("tag").getChild("child");
page_info.setStartElementListener(new StartElementListener() {

            @Override
            public void start(Attributes attributes) {
                /*---------------*/
            }
        });

Я хочу прочитать атрибуты второго элемента «tag» (label1 и label2), но мой StartElementListener читает первый тег, поскольку они имеют одинаковую структуру и атрибуты (эти label="idAd" и label="idNumPage") различают их , Как мне сказать StartElementListener обрабатывать только второй <tag> элемент?

1 Ответ

1 голос
/ 01 мая 2011

Если вы застряли на пути StartElementListener, вы должны установить слушателя на элемент tag, а когда он равен label, равно "idNumPage", установить флаг, так что другой StartElementListener выустановленный на элемент child должен быть прочитан.

Обновление Ниже приведен пример того, как сделать это с помощью этих слушателей:

android.sax.Element tag = root.getChild("tag");
final StartTagElementListener listener = new StartTagElementListener();
tag.setStartElementListener(listener);

android.sax.Element page_info = tag.getChild("child");
page_info.setStartElementListener(new StartElementListener()
{
    @Override
    public void start(Attributes attributes)
    {
        if (listener.readNow())
        {
            //TODO: you are in the tag with label="idNumPage"
        }
    }
});

И StartTagElementListener реализован с дополнительным геттером readNow, чтобы сообщить нам, когда читать атрибуты тега child:

public final class StartTagElementListener implements StartElementListener
{
    private boolean doReadNow = false;

    @Override
    public void start(Attributes attributes)
    {
        doReadNow = attributes.getValue("label").equals("idNumPage");
    }

    public boolean readNow()
    {
        return doReadNow;
    }
}

PS : Рассматривали ли вы использование реализации org.xml.sax.helpers.DefaultHandler для этой задачи?

...