2016-10-12 5 views
0

Я пытаюсь создать класс контроллера 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> 
+0

я думаю, что это разумно для реализации StAX расколоть 'значение CHARACTERS', я согласен с этим парнем: http://stackoverflow.com/a/4567652/2657100 – nandsito

ответ

1

Парсер STAX просто разделяет символы на более мелкие куски в том же порядке. Вы можете восстановить его с помощью StringBuilder, добавив некоторую проверку длины для безопасности. Или вы можете просто установить флаг, чтобы его объединить по умолчанию.

«По умолчанию анализатор STAX разбивает (как правило, latge) событие CHARACTER на части, чтобы избежать создания больших строк. У вас нет контроля над тем, где происходит этот разрыв».

«Вы можете использовать свойство фабрики« javax.xml.stream.isCoalescing »для управления этим поведением и заставить его объединить смежные события CHARACTER в одно событие».

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

+1

Добавление «javax.xml.stream.isCoalescing» делало трюк и все работает. –

1

Вы можете позвонить http://docs.oracle.com/javase/7/docs/api/javax/xml/stream/XMLEventReader.html#getElementText(), когда вы знаете, что есть только текст XMLStreamConstants.START_ELEMENT.

+0

очень хороший подход, спасибо за указание это из. Хотя это неправильное решение для этого сценария, я обязательно буду учитывать это в будущем. –

+0

@Martin, как мы можем знать, что это только элемент текста? предполагая, что мы не знаем точной структуры xml во время выполнения. – Tarik

 Смежные вопросы

  • Нет связанных вопросов^_^