【问题标题】:Stax parse doesn't return proper responseStax 解析没有返回正确的响应
【发布时间】:2014-09-13 09:05:40
【问题描述】:

你好,

我在使用 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

【问题讨论】:

    标签: jaxb unmarshalling stax


    【解决方案1】:

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

    因此,如果 xml 未格式化:- 1. Parser 找到第一个完整块并将其存储在 list 中,现在光标位于下一个标记处,但在控制进入下一次迭代之前 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();
               }
         }
    

    【讨论】:

      猜你喜欢
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 2013-06-25
      • 2015-05-02
      • 2019-10-28
      • 1970-01-01
      相关资源
      最近更新 更多