Как анализируется файл XML с SAX, когда у него есть этикетки того же имени, но в различных элементах?

Хорошие во все!

Я прихожу того, чтобы быть в stackoverflow на английском, но все еще не нахожу какое-либо решение моего сомнения. Я проверил какие-то темы, будьте главным образом, но еще он у меня не остался ясным. Также большинство сходных вопросов обрабатывает информацию с DOM, но существу самому сложному SAX он не служил многим.

У моего XML есть структура, сходная с этим примером:

<root>
  <ejemplo1>
    <ejemplo1A>
      <dato1>Hello</dato1>
      <dato2>StackOwerflow</dato2>
      <dato3>
        <datoA>1</datoA>
        <datoB>2</datoB>
      </dato3>
      <dato4>
        <datoA>3</datoA>
        <datoB>4</datoB>
      </dato4>
      <dato5>
        <datoA>5</datoA>
        <datoB>6</datoB>
      </dato5>
    </ejemplo1A>
    <ejemploB>
      ...
    </ejemploB>
  </ejemplo1>
</root>

Моя программа contruye с Main, класс, где он хранит данные об объектах, к которым я буду относиться, и класс для parser в SAX. Через booleans я попробовал "просачиваться", но также он возвращает меня null, когда с Main я извлекаю данные, чтобы показывать их пользователю.

У класса parser SAX есть структура, сходная с этим примером:

public class parserSAX extends DefaultHandler{
   private ArrayList <EjemploClass> ejemploRes = new ArrayList<EjemploClass>();
   private EjemploClass ejemploObj = new EjemploClass();
   private int indicador = -1;
   private boolean dato3 = false, dato4 = false, dato5 = false;

   @Override
   public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
       if (qName.equals("ejemplo1A")){
          //Mucho else if para tratar los demás tags.
       }else if (qName.equals("dato3")){
          dato3 = true;
          if (qName.equals("datoA") && dato3) indicador = 1; 
          else if (qName.equals("datoB") && dato3) indicador = 2; 
       } else if (qName.equals("dato4")){
          //Similar a dato3
       } else if (qName.equals("dato5")){
          //Similar a dato3
       }
   }

   @Override
   public void endElement(String uri, String localName, String qName) throws SAXException{
       if(qName.equals("ejemplo1A")){
        ejemploRes.add(this.ejemploObj); 
        ejemploObj = new EjemploClass();
       }

       if(qName.equals("dato3")){dato3 = false;}
       if(qName.equals("dato4")){dato4 = false;}
       if(qName.equals("dato5")){dato5 = false;}

       indicador = -1;
   }

   @Override
   public void characters(char[] ch, int start, int length) throws SAXException{
       String char = new String(ch, start, length);
       if (indicador == 1){ ejemploObj.setDatoA_dato3(char);}
       else if (indicador == 2){ ejemploObj.setDatoB_dato3(char);}
       //Y más else if pero para los demás.
   }

   //Y un get para el ArrayList.

}

Я осознаю, что я еще не понимаю совсем, как функционирует parser SAX, в самом деле попробовал делать другие халтуры, но это наименее жалкая, которая я должна казаться. Какая-то подсказка?

Я думаю о том, чтобы снять if else, которые внутри dato3, dato4 и dato5, чтобы оставлять изменение boolean, но потом не нахожу альтернативу, чтобы отличаться datoA datoB и поэтому это поддерживаю пока.

Спасибо заранее.

1
задан 23.05.2017, 15:39
0 ответов