我有以下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,对应于'CHARACTERS'。所以在这种情况下,我尝试了'reader.getText()
',这只是返回一个空字符串。我正在使用Java 6.任何想法在这里发生了什么?
答案 0 :(得分:1)
在<method name="sendAudio">
和<criteria>medium</criteria>
之间,您有一个换行符和多个空格。这些形成了一个文本节点,这就是你将CHARACTERS
作为事件类型的原因。
我很惊讶你在调用getText()
时得到一个空字符串。你确定它不是只有换行符和空格字符的字符串吗?