Я пытаюсь создать класс контроллера XML с помощью StAX. Моя проблема в том, что я не получаю полную строку элемента, вместо этого получаю небольшие части строки. (Обратите внимание на некоторые из содержания были скрыты по соображениям безопасности, то они будут отображаться как {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>
я думаю, что это разумно для реализации StAX расколоть 'значение CHARACTERS', я согласен с этим парнем: http://stackoverflow.com/a/4567652/2657100 – nandsito