【问题标题】:XMLStreamReader - Strange errorXMLStreamReader - 奇怪的错误
【发布时间】:2011-07-05 20:46:15
【问题描述】:

我有以下 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()' 因为 '&lt;criteria&gt;' 元素只是一个文本元素,API 说此方法读取“纯文本元素”的文本(引用) .我已经使用“reader.getEventType()”检查了事件类型,它返回一个 4,对应于“CHARACTERS”。所以在那种情况下,我尝试了 'reader.getText()' ,这只是返回一个空字符串。我正在使用 Java 6。有什么想法吗?

【问题讨论】:

    标签: java xml xmlstreamreader


    【解决方案1】:

    &lt;method name="sendAudio"&gt;&lt;criteria&gt;medium&lt;/criteria&gt; 之间,有一个换行符和多个空格。这些构成了一个文本节点,这就是为什么您将CHARACTERS 作为事件类型。

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

    【讨论】:

    • 你是对的。我完全忽略了他们。解决方案是调用“reader.nextTag()”跳过空白,然后调用“reader.getElementText()”从“”获取文本
    • 是的,我这个所谓的“空字符串”实际上是一个带有空格字符的“crlf”。
    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 2014-10-11
    • 2012-04-27
    • 2013-10-30
    • 2016-09-18
    • 2012-03-18
    • 2015-05-13
    • 2016-07-14
    相关资源
    最近更新 更多