我正在尝试解析并从Web服务获取值。问题是Web服务具有相同的元素名称标记,这些标记创建了要解析的问题,因为我想获取它们的值,但它们具有相同的名称所以我很难将它们称为localname。
<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 = "";
答案 0 :(得分: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);
}
}
为其他最外向的标签做。希望它会对你有所帮助。
答案 1 :(得分: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);
}