2012-07-06 125 views
1

我想解析並從Web服務獲取值。問題是Web服務具有相同的元素名稱標籤,這些元素名稱標籤正在創建問題來解析,因爲我想獲取它們的值,但它們具有相同的名稱。因此,我很難將它們提及爲本地名稱。Android:如何解析SAX解析器中的相同標記?

<countryBean> 
     <id>236</id> 
     <name>United State</name> 
    </countryBean> 
    <secutiryQuestion1> 
     <id>2</id> 
     <question>What was your dream job as a child?</question> 
    </secutiryQuestion1> 
    <secutiryQuestion2> 
     <id>4</id> 
     <question>What is the name, breed, and color of your pet?</question> 
    </secutiryQuestion2> 
    <stateBean> 
     <country>236</country> 
     <id>5</id> 
     <name>California</name> 
    </stateBean> 
    <statusBean> 
     <id>1</id> 
     <name>Active</name> 
    </statusBean> 

我想獲得ID標籤和其他相鄰標籤的價值,如名稱,問題在不同的變量。這裏有5個Id標籤。

我的類的代碼是這樣

public class XmlParser extends DefaultHandler { 

     public RestfullResponse tempResponse = null; 
     String currentValue = null; 
     int ServiceType =0; 

     @Override 
     public void startElement(String uri, String localName, String qName, 
       Attributes attributes) throws SAXException { 
      if(localName.equalsIgnoreCase("countryBean")){ 
       tempResponse=new RestfullResponse(); 

       }   

     } 


     /* (non-Javadoc) 
     * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String) 
     */ 
     @Override 
     public void endElement(String uri, String localName, String qName) 
       throws SAXException { 
      if(ServiceType == 1) 
      { 
       if(localName.equalsIgnoreCase("id")){ 
        tempResponse.setCountryId(currentValue); 
       } 
       if(localName.equalsIgnoreCase("name")){ 
        tempResponse.setCountryName(currentValue); 
       } 

       if(localName.equalsIgnoreCase("id")){ 
        tempResponse.setStateId(currentValue); 
       } 
       if(localName.equalsIgnoreCase("question")){ 
        tempResponse.setstateBean(currentValue); 
       } 

       if(localName.equalsIgnoreCase("Id")){ 
        tempResponse.setStatusId(currentValue); 
       } 
       if(localName.equalsIgnoreCase("requestSuccess")){ 
        tempResponse.setStatus(currentValue); 
       } 
      } 
     } 

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

     public RestfullResponse getResponse(){ 
      return tempResponse; 
     } 
} 

請幫忙將它們存儲在

String CountryName= ""; 
String CountryId = ""; 
String Statename = ""; 
String StateId =""; 
String Status = ""; 
String StatusId = ""; 
String Username =""; 
String SecurityQuestion = ""; 
String SecurityQuestionId = ""; 

回答

1

你需要保持stack of root nodes

取一個變量String root並保持一個stack of root element

內部的startElement方法:

public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException, 
      IllegalArgumentException 
{ 

    // call to abstract method 
    onStartElement(namespaceURI, localName, qName, atts); 

    // Keep the trace of the root nodes 
    if (root.length() > 0) 
    { 
    root= root.concat(","); 
    } 
    root= root.concat(localName); 
} 

內部的endElement方法:

public void endElement(String namespaceURI, String localName, String qName) throws SAXException 
{ 
    // remove the end element from stack of root elements 
    int index = root.lastIndexOf(','); 
    if (index > 0) 
    { 
    root= root.substring(0, index); 
    } 
    onEndElement(namespaceURI, localName, qName); 
} 
2

添加布爾變量isCountryBean;

boolean isCountryBean = false , isSecurityQuestion1 = false; 

而在的startElement(....)寫:

if(localName.equalsIgnoreCase("countryBean")){ 
    isCountryBean = true; 
    // other stuff 
} else if (localName.equalsIgnoreCase("secutiryQuestion1")){ 
    isSecurityQuestion1 = true; 
    isCountryBean = false; 
} 

而在的endElement(...)檢查:

if(localName.equalsIgnoreCase("id")){ 
    if(isCountryBean){ 
     tempResponse.setCountryId(currentValue); 
    } 
} 
if(localName.equalsIgnoreCase("name")){ 
    if(isCountryBean){ 
     isCountryBean = false; 
     tempResponse.setCountryName(currentValue); 

    } 
} 

做它爲其他大部分向外標籤。希望它能幫助你。

+0

感謝您的解決方案 – vuhung3990 2016-02-26 03:48:02