嗨,
在使用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 :(得分: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();
}
}