2016-10-12 26 views
0

我一直在嘗試使用StAX創建XML控制器類。 我的問題是,我沒有得到一個元素的完整字符串,而是我得到了字符串的小部分。 (注意有些內容已被隱藏出於安全考慮,這些將顯示爲{content}StAX不返回字符串中的所有字符

Characters characters = event.asCharacters(); 
if (!characters.isWhiteSpace()) { 
    System.out.println(characters.getData()); 
} 

上面的代碼不會返回完整的字符串。

我希望收到的是:
{responseType} \([0-9]+\) ACC: [0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+

我所得到的是在5個各個部件上面的字符串:
{responseType} \([0-9]+\) ACC: [0-9]
+,[0-9]+,[0-9]
+,[0-9]+,[0-9]
+,[0-9]+,[0-9]
+,[0-9]+

我代碼:

public static ArrayList<SmsCommand> readXML() { 
    if (init()) { 
     try { 
      while (eventReader.hasNext()) { 
       XMLEvent event = eventReader.nextEvent(); 
       switch (event.getEventType()) { 
       case XMLStreamConstants.START_ELEMENT: 
        StartElement startElement = event.asStartElement(); 
        String qName = startElement.getName().getLocalPart(); 
        if (qName.equalsIgnoreCase("command")) { 
         Iterator<Attribute> attributes = startElement.getAttributes(); 
         command = new SmsCommand(attributes.next().getValue()); 
        } 
        break; 
       case XMLStreamConstants.CHARACTERS: 
        Characters characters = event.asCharacters(); 
        if (!characters.isWhiteSpace()) { 
         command.addResponse(characters.getData()); 
        } 
        break; 
       case XMLStreamConstants.END_ELEMENT: 
        EndElement endElement = event.asEndElement(); 
        if (endElement.getName().getLocalPart().equalsIgnoreCase("command")) { 
         commands.add(command); 
        } 
        break; 
       } 
      } 
     } 
     catch (XMLStreamException e) { 
      e.printStackTrace(); 
     } 
    } 
    return commands; 
} 

,以及我的xml:

<?xml version="1.0" ?> 
<root> 
    <command type="{command}"> 
    <response>{responseType} \([0-9]+\) ACC: [0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+</response> 
    </command> 
</root> 
+0

我認爲這是合理的StAX實現分裂'CHARACTERS'值,我這傢伙同意:http://stackoverflow.com/a/4567652/2657100 – nandsito

回答

1

STAX解析器只是將字符按照相同的順序拆分成小塊。您可以使用StringBuilder重建它,同時爲安全添加一些長度檢查。或者你可以設置一個標誌來默認合併它。

「默認情況下,StAX語法分析器會將CHARACTER事件分解爲多個部分以避免創建大型字符串,您無法控制此中斷髮生的位置。

「您可以使用工廠屬性」javax.xml.stream.isCoalescing「來控制此行爲並強制它將相鄰的CHARACTER事件合併爲一個事件。」

http://helpdesk.objects.com.au/java/stop-stax-breaking-character-event

+1

添加「javax.xml.stream.isCoalescing」做了竅門,一切正常。 –