2012-07-06 87 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