2010-12-20 36 views
1

在意見上有人在這裏#2我改變解析到的SAXParser的我的方法。如何調整我的代碼,這種情況對於SAX解析XML Android中

由於不同的教程我能得到它的工作,我不得不說,它的工作速度(這是非常重要的,我的應用程序)。

的問題,然而,就是我的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; 
    } 

那麼如何,我必須調整呢?

回答

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確實爲我工作! – Galip 2010-12-20 14:25:29

1

剛剛修改的endElement()...

添加標記來指示當前名稱將被保存,因爲你有名稱,下兩<BreakdownInsurance> <Personal>到來。

+0

添加標誌是什麼意思? – Galip 2010-12-20 13:44:55

1

深度不應該是一個問題。我有更多的級別,確切的代碼適合我。難道你有幾個同名的節點?個人中的「姓名」和那些保險節點中的「姓名」?

+0

是的。我在所有4項保險中都有「姓名」和「InsuranceNR」。 – Galip 2010-12-20 13:41:55

+0

是的,我知道。我的意思是,這可能是問題所在。快速介紹SAX解析器的工作原理,http://en.wikipedia.org/wiki/Simple_API_for_XML。由於它檢測到事件,因此它不知道「姓名」和「保險姓名」之間的區別。 – springrolls 2010-12-20 13:52:33

+0

嗯。那麼你如何解決這個問題呢? – Galip 2010-12-20 13:58:00