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>
'element - это только текстовый элемент, и API говорит, что этот метод читает текст "только текстового элемента" (для цитирования). Я проверил тип события, используяreader.getEventType()
и возвращает 4, что соответствует "CHARACTERS". Так что в этом случае я попыталсяreader.getText()
'и это просто возвращает пустую строку. Я использую Java 6. Есть идеи, что здесь происходит?
1 ответ
Между <method name="sendAudio">
а также <criteria>medium</criteria>
, у вас есть символ новой строки и несколько пробелов. Они образуют текстовый узел, и поэтому вы получаете CHARACTERS
как тип события.
Я удивлен, что вы получили пустую строку при звонке getText()
, Вы уверены, что это была не строка с символами новой строки и пробелами?