Как настроить мой код в этой ситуации для синтаксического анализа SAX XML в Android - PullRequest
1 голос
/ 20 декабря 2010

По совету кого-то здесь, на 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>

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

Это код, который я использую в своем классе 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;
    }

Так как мне это настроить?

Ответы [ 3 ]

1 голос
/ 20 декабря 2010

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

1 голос
/ 20 декабря 2010
@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 - логическое значение. использовать его как флаг ...

1 голос
/ 20 декабря 2010

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

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

...