2011-08-16 5 views
1

먼저 내 질문에 더 좋은 제목을 찾지 못했지만 몇 마디가 있으면 업데이트하십시오. (사용자 권한이 부여 된 경우, 사용자 확인을 위해 하나의 데이터에 대한 또 다른) 현재에서하나의 요청으로 두 개의 다른 xml 파일 처리 : Android

나는이 목적을 위해 두 개의 요청을 보낸다 : 내가 뭐하는 거지

. 하지만 단일 요청을 사용하고 싶습니다.

내가 원하는 것은 :

나는 응답이 내 요청에 따라 같은 서버가 XML을 보내드립니다 서버에 POST 방법으로 요청을 보낼 것입니다. 예를 들어

: 나는 서버에 사용자 및 암호를 전송하고

  • .
  • 서버가 해당 사용자를 인증합니다.

    :

    인증이 실패한 경우 enter image description here

  • 는 서버

enter image description here

I 직면 한 문제로 응답 송신으로 사용자가 승인하면

  • 는 서버 응답 XML을 보낸다

    I XML 데이터를 처리 할 수 ​​없으며 실제로 XML 데이터를 식별하지 못합니다.

    나는 android.sax 파서를 사용하고 있으며 두 가지 유형의 XML 응답에 대해 두 가지 파서 클래스를 만들었지 만 응답에 따라 사용할 파서 클래스를 어떻게 식별 할 수 있습니까?

    업데이트 :

    여기

    내 실제 XML입니다

    enter image description hereenter image description here

    그래서 하나의 파서를 사용하여 구문 분석 할 수있는 방법?

  • +0

    왜 파서를 하나만 사용합니까? 오류 파서가 null 또는 오류에 대해 알려주는 일종의 플래그를 반환하도록하십시오. –

    +0

    David Olsson 단일 구문 분석기를 사용할 수 있습니다. 하지만 나는 어떻게 서로 다른 XML에 대해 단일 파서를 사용할 수 있는지에 대해 잘 모른다. 정보를 입력하십시오. –

    +0

    예를 들어 하나의 파서를 사용할 수있는 답변을 게시했습니다. –

    답변

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

    그리고 당신의 파서

    를 참조하십시오. 이는 성공했을 경우 웹 서비스의 응답에 응답 태그가 포함되지 않는다는 사실에 기반합니다.

    파서의 예입니다. 사용하기 전에 몇 가지 조작이 필요할 수 있습니다. 응답에 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

    대단하군요! 하지만 문제는 제 두 번째 XML (실제로)이 다릅니다. 방금 XML 예제를 작성했습니다. 내 실제 XML을 넣을 수 있습니까? –

    +0

    네, 질문에 넣어주십시오. 실제로 문제가되지 않는다면, 다른 if-case에서 localName.equals ("yourRealTags")를 변경해야합니다. –

    +0

    내 질문을 업데이트했습니다. –

    0

    응답은 응답 값을 전달하는 데 특히 적합한 응답 클래스를 갖는 것입니다. 일반적인 구조는 다음과 같습니다

    • ISERROR
    • 메시지
    • 데이터

    아이디어 그렇다면 모든 응답을, 당신은 ... 그것은 오류 여부를 확인할 수 있다는 것입니다, 사용자에게 메시지의 값을 표시 할 수 있습니다. 그렇지 않다면 '데이터'를 가져와 역 직렬화하십시오.