XMLStreamReader — странная ошибка

У меня есть следующий XML-код

    <class name="ContentStreamer">
        <method name="sendAudio">
            <criteria>medium</criteria>
        </method>
        <method name="sendVideo">
            <criteria>weak</criteria>
        </method>
    </class>

Я перебираю его со следующим кодом (используя XMLStreamReader)

if (reader.getEventType() == XMLStreamReader.START_ELEMENT) {
    String elementName = reader.getName().toString();
    if (elementName.equalsIgnoreCase("class")) {
        // get the class name and construct a Class
        classComposition = new ClassComposition();
        classComposition.setName(reader.getAttributeValue(0));
        System.out.println("***** Class: " + reader.getAttributeValue(0));
    } 
    else if (elementName.equalsIgnoreCase("method")) {
        MethodCriterion method = new MethodCriterion();
        method.setMethodName(reader.getAttributeValue(0));  
        System.out.println("***** Method: " + reader.getAttributeValue(0));
        // move forward and get the text from the '<criteria>' element
        reader.next();
        System.out.println("!!!" + reader.getName().toString());
    }
    else if (elementName.equalsIgnoreCase("criterion")) {
        return compositions;
    }
}

Вывод, который я получаю на консоли:

***** Class: ContentStreamer
***** Method: sendAudio
There was an error parsing the composition file
java.lang.IllegalStateException: Illegal to call getName() when event type is CHARACTERS. Valid states are START_ELEMENT, END_ELEMENT
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.getName(Unknown Source)

Область кода, которая вызывает у меня затруднения, — это последние «reader.next()» и «System.out.println». Я заменил «reader.getName().toString()» на «reader.getElementText()», поскольку элемент «<criteria>» является только текстовым элементом, и API говорит, что этот метод считывает текст «текстового элемента» (цитировать). Я проверил тип события, используя «reader.getEventType()», и он возвращает 4, что соответствует «СИМВОЛАМ». Итак, в этом случае я попробовал «reader.getText()», и это просто возвращает пустую строку. Я использую Java 6. Есть идеи, что здесь происходит?


person Joeblackdev    schedule 05.07.2011    source источник


Ответы (1)


Между <method name="sendAudio"> и <criteria>medium</criteria> у вас есть символ новой строки и несколько пробелов. Они образуют текстовый узел, поэтому вы получаете CHARACTERS в качестве типа события.

Я удивлен, что вы получили пустую строку при вызове getText(). Вы уверены, что это не была строка, состоящая только из символов новой строки и пробела?

person JB Nizet    schedule 05.07.2011
comment
Ты прав. Я совершенно проглядел их. Решение состоит в том, чтобы вызвать «reader.nextTag()», чтобы пропустить пробел, а затем вызвать «reader.getElementText()», чтобы получить текст из «‹criteria›» - person Joeblackdev; 06.07.2011
comment
Да, моя так называемая «пустая строка» на самом деле была «crlf» с пробелами. - person Joeblackdev; 06.07.2011