2011-08-16 12 views
1

まずは私の質問のタイトルが分かりませんでした。 (ユーザが許可されている場合、ユーザー検証のための一つは、データのための別の)現在で1つのリクエストで2つの異なるxmlファイルを扱います:Android

が、私はこの目的のために2つの要求を送信しています:私は何をやっている

。しかし、私は単一の要求を使用したい。私が欲しいもの

私は応答が私の要求に依存するサーバはXMLを送信するサーバーにPOSTメソッドとして要求を送信します。例えば

  • 私は、サーバーにユーザー名とパスワードを送信しています。
  • サーバーはそのユーザーを認証します。私が直面しているユーザーが許可した場合、認証が失敗した場合は
  • 、サーバは

    enter image description here

  • として応答XMLを送信し、サーバは

enter image description here

として応答を送信する問題:

I XMLデータを処理できません。実際にXMLデータを識別しません。

私はandroid.saxパーサーを使用していると私は、XML応答の両方のタイプのための2つのパーサクラスを作成し、しかし、どのように私は、応答に依存するパーサクラスIは、使用すべき特定することができますか?

更新:

ここ

私の実際のXMLである

enter image description hereenter image description here

だから私は、単一のパーサーを使用して、それを解析することができますか?

+0

なぜパーサーを1つだけ使用しますか?エラーパーサーがnullを返すようにするか、エラーについての何らかのフラグを返すようにしてください。 –

+0

David Olsson私は単一パーサーを使用できます。しかし、私はどのように別の異なるXMLのための単一のパーサーを使用することができないのか分からない。いくつかの情報を提供してください。 –

+0

私は、1つのパーサーを使用できるようにするための例を挙げて回答を掲載しました。 –

答えて

1

パーサーが失敗したかどうかを確認できるデータ構造を使用します。 例:

public class XMLResponse { 
private boolean hasFailed; 
private Employee employee; 
public void setFailure(boolean in) { 
    this.hasFailed=in; 
} 
public void setEmployee(Employee in) { 
    this.employee=in; 
} 
} 

そして、応答が偽であるかどうかを確認してください。これは、成功した場合、Webサービスからの応答に応答タグが含まれていないという事実に基づいています。

ここではパーサーの例を示します。使用する前にいくつかの調整が必要な場合があります。あなたの回答に1人の従業員しかいない場合、それ以外の場合はリストを使用する必要があります。

public class XMLHandler extends DefaultHandler { 
private XMLResponse myResponse; 
private Employee employee; 
public XMLResponse getParsedData() { 
    return this.myResponse; 
} 
@Override 
public void startDocument() throws SAXException { 
    myResponse = new XMLResponse(); 
    employee = new Employee(); 
} 

@Override 
public void startElement(String namespaceURI, String localName, 

     String qName, Attributes atts) throws SAXException { 
    buffer = new StringBuffer(); 
    if(localName.equals("employee")) { 
     employee.setId(atts.getValue("id")); 
    } 
} 
@Override 

public void endElement(String namespaceURI, String localName, String qName) 

throws SAXException { 

    if(localName.equals("response")) { 
     if(buffer.toString().contains("failure")) { 
      myResponse.setFailure(true); 
     } 
    } 
    else if(localName.equals("info")) { 
     /* 
     * This is only an example, could bee employee or whatever. You should use the startElement to get the tag. 
     */ 
    } 
    else if(localName.equals("name")) { 
     employee.setName(buffer.toString()); 
    } 
    else if(localName.equals("age")) { 
     employee.setAge(buffer.toString()); 
    } 
    else if(localName.equals("employee")) { 
     myResponse.setEmployee(employee); 
    } 


} 

/** Gets be called on the following structure: 

* <tag>characters</tag> */ 


StringBuffer buffer; 
@Override 
public void characters(char ch[], int start, int length) { 

    buffer.append(ch,start,length); 
} 
+0

これは素晴らしいことです!しかし、問題は同じですが、私の2番目のXML(実際には)は異なります。私はただXMLの例を載せました。私の実際のXMLを入れてもよろしいですか? –

+0

はい、あなたの質問に入れてください。実際には重要ではありません。異なるif-caseでlocalName.equals( "yourRealTags")を変更するだけです。 –

+0

私は自分の質問を更新しました。 –

0

答えは、応答値の通信に特に適した応答クラスを持つことです。一般的な構造は次のとおりです。

  • ISERROR
  • メッセージ
  • データ

アイデアは、すべての応答のために、あなたはそれが誤りだったかどうかを確認することができますということです...もしそうなら、メッセージの値をユーザーに表示することができます。そうでない場合は、 'データ'を取り出してデシリアライズしてください。

関連する問題