2014-09-13 5 views
0

안녕하세요,Stax 구문 분석이 적절한 응답을 반환하지 않습니다.

Jaxb와 SOAP 응답을 구문 분석하는 동안 매우 이상한 문제가 있습니다. 내가 구문 분석하는 동안 태그의 전체 목록을 얻을 수 없습니다 .Stax 파서는 단 하나의 태그를 구문 분석 할 수있는 어떤 오류 또는 예외를 제공하지 않습니다. XML 응답 (문자열에 저장됩니다) 형식을 시도하면 모든 것이 완벽하게 작동합니다 벌금. 여기에 내가 그것을 구문 분석하고있는 무슨이다 : -

여기
public void parseResponse(){ 
    String response="<SOAP:Body><response><result><myTag></myTag><myTag></myTag>/result</response</SOAP:Body>"; 

    getUnmarshalledObject(response,myTag,MyTag.class,"com.mylearning.parseXml"); 
    } 





    public <T> List<T> getUnmarshalledObject(String response ,String TAG_TO_SEARCH ,Class<T> clazz , String basePkg) 
            throws XMLStreamException, JAXBException{ 
          Reader reader = new StringReader(response); 
          XMLInputFactory xif = XMLInputFactory.newInstance(); 
          XMLStreamReader xsr = xif.createXMLStreamReader(reader); 

          List<T> listOfUnmarshalledObjects = new ArrayList<T>(); 
          while (xsr.hasNext()) { 
           if (xsr.getEventType() == XMLStreamReader.START_ELEMENT && TAG_TO_SEARCH.equals(xsr.getLocalName())) { 
             T unmarshalledObj = unmarshalXml(clazz ,xsr, basePkg); 
             listOfUnmarshalledObjects .add(unmarshalledObj); 
            } 
            xsr.next(); 
           } 
          return listOfUnmarshalledObjects; 
         } 

문제의 다양한 사용 사례입니다 : -이

  Case 1:- Input String response is unformatted. 
      Result :- listOfUnmarshalledObjects is 1. 

      Case 2:- Format response with response.replaceAll("><",">\n<"); 
      Result:- listOfUnmarshalledObjects is 2. 

      Case 3 : Input String unformatted , just give space b/w </myTag><myTag> 
      Result: listOfUnmarshalledObjects is 2. 

      I tried my best to explain the question, please help me.      
      > Blockquote 

답변

0

나는 주범 다른 조건이 누락 된 것으로 나타났다. 구문 분석 커서는 ..tag의 첫 번째 블록을 찾을 수 있었지만 일단 완료되면 xsr.next도 각 반복에서 실행됩니다.

xml 형식이 지정되지 않은 경우 : - 1. 파서는 첫 번째 전체 블록을 찾아 목록에 저장합니다. 이제 커서는 다음 태그에 있지만 컨트롤이 다음 반복으로 넘어 가기 전에 xsr.next가 실행되고 커서를 다음 즉시 태그로 이동합니다. XML 형식의 경우

는 : - xsr.next 각 반복 에서 실행됩니다 n은 그렇게해도 그냥 먹을 것 \ n 문자 커서 것은 잘 될 것 1. 두 개의 연속 블록 \ 사이에 n 개의 문자를 \있을 것입니다 태그의 다음 블록을 구문 분석하기위한 트랙. 여기

다른 조건 업데이트 된 코드입니다 : -

while (xsr.hasNext()) { 
    if (xsr.getEventType() == XMLStreamReader.START_ELEMENT && TAG_TO_SEARCH.equals(xsr.getLocalName())) { 
      T unmarshalledObj = unmarshalXml(clazz ,xsr, basePkg); 
      listOfUnmarshalledObjects .add(unmarshalledObj); 
     }else{ 
      xsr.next(); 
      } 
    } 
관련 문제