1

Webサービスから値を解析して取得しようとしています。問題は、Webサービスに同じ要素名タグがあり、それらの値を取得したいので解析するのに問題が発生しているが、それらは同じ名前であるため、ローカル名として言及するのは難しいことです。

 <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 = "";
4

2 に答える 2

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);

     }
}

他の最も外側のタグに対してそれを行います。それがあなたを助けることを願っています。

于 2012-07-06T13:53:10.563 に答える
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);
}
于 2012-07-06T13:15:48.707 に答える