2011-07-05 181 views
2

我有以下XML代碼的XMLStreamReader - 奇怪的錯誤

<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

<method name="sendAudio"><criteria>medium</criteria>之間,你有一個換行字符和一些空格。這些形成一個文本節點,這就是爲什麼你得到CHARACTERS作爲事件類型。

當你撥打getText()時,我很驚訝你有空字符串。你確定它不是隻有換行符和空格字符的字符串嗎?

+0

你說得對。我完全忽略了他們。解決方法是調用'reader.nextTag()'跳過空格,然後調用'reader.getElementText()'從'' – Joeblackdev

+1

獲取文本是的,這個我所謂的'空字符串'實際上是一個' crlf'與空格字符。 – Joeblackdev