XMLStreamReader - 奇怪的错误

时间:2011-07-05 20:46:15

标签: java xml 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,对应于'CHARACTERS'。所以在这种情况下,我尝试了'reader.getText()',这只是返回一个空字符串。我正在使用Java 6.任何想法在这里发生了什么?

1 个答案:

答案 0 :(得分:1)

<method name="sendAudio"><criteria>medium</criteria>之间,您有一个换行符和多个空格。这些形成了一个文本节点,这就是你将CHARACTERS作为事件类型的原因。

我很惊讶你在调用getText()时得到一个空字符串。你确定它不是只有换行符和空格字符的字符串吗?