Stax解析不会返回正确的响应

时间:2014-09-13 09:05:41

标签: jaxb unmarshalling 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

1 个答案:

答案 0 :(得分:0)

我发现主要罪魁祸首是其他情况。 解析游标能够找到..tag的第一个块,但是一旦完成它,xsr.next也会在每次迭代中执行。

所以如果没有格式化xml: - 1.解析器找到第一个完整的块并将其存储在列表中,现在游标位于下一个标记但在控制进入下一次迭代之前,xsr.next被执行并将光标移动到下一个直接标记。

如果是格式化的xml: - 1.两个连续块之间将有\ n字符\ n即使每次迭代都执行xsr.next也是如此 它只会吃\ n字符和光标将在轨道上解析下一个标记块。

以下是带有else条件的更新代码: -

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