Java XMLStreamReader выдает нежелательную строку

У меня есть XML, который я читаю, вот он.

<application>
    <client>website</client>
    <register>
        <name>
            <first>Tommy</first>
            <second>Jay</second>
        </name>
        <address>
            <firstLine>line1</firstLine>
            <secondLine>line2</secondLine>
            <city>city1</city>
            <county>county1</county>
            <postcode>YY12 9UY</postcode>
        </address>
    </register>
</application>

В любом случае, когда я прочитал его с помощью xmlStreamReader, как показано ниже

public XMLElementALT getNextElement()
{
    element = new XMLElementALT();
    int event;
    try
    {
        event = reader.next();
    } 
    catch (XMLStreamException ex)
    {
        return null;
    }

    if (event == XMLStreamConstants.START_ELEMENT)
    {
        element.setTag(reader.getLocalName());
    }
    else if (event == XMLStreamConstants.CHARACTERS)
    {
        element.setAttribute(reader.getText());
    }
    else if (event == XMLStreamConstants.END_ELEMENT)
    {
        element.setEndTag(reader.getLocalName());
    }
    else if (event == XMLStreamConstants.END_DOCUMENT)
    {
        element.setFinished();
    }
    return element;
}

Все идет хорошо! Однако проблема, с которой я столкнулся, заключается в том, что после прочтения тега следующее событие, которое я получаю, - это событие XMLStreamConstants.CHARACHTERS, и оно сообщает, что у меня есть атрибут ("\ n"), который представляет собой пространство между тегом и следующим тегом. Как я могу это удалить? Я хочу иметь следующее событие как XMLStreamConstants.START_ELEMENT. Я знаю, что могу поместить свой XML в одну строку, но мне нравятся пропуски при вводе, чтобы я мог видеть структуру. У меня также есть xsd для проверки, и это успешно проверяет xml, есть ли у них что-то, что я могу сделать в xsd, чтобы он удалил пробелы?

Спасибо


person bubblebath    schedule 09.08.2012    source источник


Ответы (1)


Вы можете игнорировать CHARACTERS события, содержащие только пробелы, либо внутри вашего getNextElement метода, либо с помощью фильтра при создании читателя.

XMLInputFactory factory = XMLInputFactory.newFactory();
XMLStreamReader rawReader = factory.createXMLStreamReader(...);
XMLStreamReader filteredReader = factory.createFilteredReader(rawReader,
  new StreamFilter() {
    public boolean accept(XMLStreamReader r) {
      return !r.isWhiteSpace();
    }
  });

Метод isWhiteSpace возвращает истину, если текущее событие - событие CHARACTERS, состоящее полностью из пробелов. Он возвращает false, если это не CHARACTERS событие или CHARACTERS, но не все пробелы.

Однако важно отметить, что XMLStreamReader не гарантированно вернет все текстовое содержимое элемента в одном единственном событии CHARACTERS, разрешено предоставить вам несколько отдельных блоков символов, которые вы должны объединить вместе сами.

person Ian Roberts    schedule 09.08.2012
comment
Есть ли шанс уточнить это на примере, касающемся невыполнения всего текстового содержимого элемента? - person Jens Bodal; 13.03.2014
comment
@akevit Если у вас есть XML, такой как <ex>foobar</ex>, и синтаксический анализатор не установлен в режим объединения, тогда разрешается разделить содержимое символа и передать его вам в нескольких отдельных событиях, например вы можете получить START_ELEMENT, CHARACTERS:foo, CHARACTERS:bar, END_ELEMENT вместо трех ожидаемых событий. Вы можете заставить его объединить соседние серии символов в одно событие, установив свойство IS_COALESCING в XMLInputFactory перед созданием считывателя. - person Ian Roberts; 13.03.2014
comment
@akevit Я подозреваю, что в 99% случаев этого не произойдет, но это разрешено спецификацией, поэтому вы должны знать о возможности (например, если конкретный синтаксический анализатор буферизует содержимое внутри в буфере фиксированного размера и элемент содержимое, которое вы смотрите, выходит за границы буфера). - person Ian Roberts; 13.03.2014
comment
Хорошо, чтобы прояснить для себя, полагаясь на XMLEventReader.peek().isCharacters(), тогда, если истинный синтаксический анализ результирующего .toString() ненадежен? Это далеко не все. Я просто экспериментирую с синтаксическим анализом XML, но это то, что у меня было до сих пор: pastebin.com/rS7hTm2u < / а>. Я не уверен, следует ли мне сейчас задавать свой вопрос, однако у меня его не было, пока я не наткнулся на этот пост. Учитывая вышеизложенное, правильно ли я устанавливаю свойство с помощью factory.setProperty(XMLInputFactory.IS_COALESCING, true);? - person Jens Bodal; 13.03.2014