Как настроить мой код в этой ситуации для синтаксического анализа SAX XML в Android

1

По рекомендации кого-то здесь, в Stackoverflow, я изменил свой метод разбора на SAXParser.

Благодаря различным учебникам я могу заставить его работать, и я должен сказать, что он работает быстрее (что очень важно для моего приложения).

Проблема, однако, в том, что мой XML файл идет глубже, чем пример XML, который я видел.

Это пример моего XML файла:

<Message>  

  <Service>servicename</Service>

  <Insurances>

    <BreakdownInsurance>

      <Name>Insurance name</Name>

      <InsuranceNR/>

      <LicenseNr/>

    </BreakdownInsurance>

    <CarDamageInsurance>

      <Name>Insurance name 2</Name>

      <InsuranceNR></InsuranceNR>

    </CarDamageInsurance>
  </Insurances>

  <Personal>
    <Name>my name</Name>
  </Personal>
</Message>

Я могу получить личные данные, такие как имя, но мой код, похоже, не работает с страхованием. Я думаю, это потому, что это еще один node.

Это код, который я использую в классе Handler:

@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
    currentElement = true;
    if (localName.equals("Message")) {
        geg = new GegevensXML();
    }
}

@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
    currentElement = false;

    /********** Autopech **********/
    if (localName.equals("Name")) {
        geg.setAutopechMaatschappij(currentValue);
    }
    else if (localName.equals("InsuranceNR")){
        geg.setAutopechPolis(currentValue);
    }
    else if (localName.equals("LicenseNr")){
        geg.setAutopechKenteken(currentValue);
    }

@Override
public void characters(char ch[], int start, int length) {
    if (currentElement) {
        currentValue = new String(ch, start, length);
        currentElement = false;
    }

Итак, как мне настроить его?

Теги:
sax

3 ответа

1
Лучший ответ
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
    currentElement = true;
    if (localName.equals("Message")) {
        geg = new GegevensXML();
    }
    if(localName.equals("BreakdownInsurance"))
    {
      BreakdownInsurance = true;
    }
}

@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
    currentElement = false;

    /********** Autopech **********/
    if (localName.equals("Name"))
    {
     if(BreakdownInsurance)
     {
       geg.setBreakdownInsuranceName(currentValue);

       BreakdownInsurance = false;
     }
     else
     {
       geg.setAutopechMaatschappij(currentValue);
      }

    }
    else if (localName.equals("InsuranceNR")){
        geg.setAutopechPolis(currentValue);
    }
    else if (localName.equals("LicenseNr")){
        geg.setAutopechKenteken(currentValue);
    }


Аналогично делать это для других случаев... 'BreakdownInsurance' является логическим. используйте его как флаг...

  • 0
    Thnx работал на меня!
1

Глубина не должна быть проблемой. У меня больше уровней, и точный код работает отлично для меня. Может быть, у вас есть несколько узлов с тем же именем? "Имя" в Личном и "Имя" в этих узлах страхования?

  • 0
    Да. У меня есть «Имя» и «Страхование NR» во всех 4 страховках.
  • 0
    Да, я знаю. Я имею в виду, это может быть проблемой. Краткое введение в работу парсера SAX, en.wikipedia.org/wiki/Simple_API_for_XML . Так как он обнаруживает событие, он не знает разницы между Именем в Личном и Именным в страховых.
Показать ещё 3 комментария
1

Просто измените endElement()...

Добавьте флаги, чтобы указать, где текущее Имя должно быть сохранено, поскольку у вас есть Имя, которое подходит как под <BreakdownInsurance> , так и <Personal>.

  • 0
    Что вы подразумеваете под добавлением флагов?

Ещё вопросы

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