2011-10-12 144 views
0

我編寫將解析XML文件的應用程序。我使用SAX解析器,這裏是我的SAX處理代碼:Java和解析XML

public class XMLHandler extends DefaultHandler { 

private static final String MEASURES = "measures"; 

private static final String SUGARMEASUREDATE = "sugarMeasureDate"; 
private static final String SUGARMEASUREVALUE = "sugarMeasureValue"; 

private static final String UPGYROSCOPEDATE = "upGyroscopeDate"; 
private static final String UPGYROSCOPEVALUE = "upGyroscopeValue"; 

private static final String DOWNGYROSCOPEDATE = "downGyroscopeDate"; 
private static final String DOWNGYROSCOPEVALUE = "downGyroscopeValue"; 

Boolean currentElement = false; 
String currentValue = null; 

public static MeasureLists measureLists = null; 

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
    currentElement = true; 

    if (localName.equals("measures")) { 
     measureLists = new MeasureLists(); 
    } 
} 

public void endElement(String uri, String localName, String qName) throws SAXException { 

    currentElement = false; 
    if (localName.equals(SUGARMEASUREDATE)) { 
     measureLists.setSugarDate(currentValue); 
    } 
    else if (localName.equals(SUGARMEASUREVALUE)) { 
     measureLists.setSugarValue(currentValue); 
    } 
    else if (localName.equals(UPGYROSCOPEDATE)) { 
     measureLists.setUpGyroscopeDate(currentValue); 
    } 
    else if (localName.equals(UPGYROSCOPEVALUE)) { 
     measureLists.setUpGyroscopeValue(currentValue); 
    } 
    else if (localName.equals(DOWNGYROSCOPEDATE)) { 
     measureLists.setDownGyroscopeDate(currentValue); 
    } 
    else if (localName.equals(DOWNGYROSCOPEVALUE)) { 
     measureLists.setDownGyroscopeValue(currentValue); 
    } 
} 

public void characters(char[] ch, int start, int length) throws SAXException { 

    if (currentElement) { 
     currentValue = new String(ch, start, length); 
     currentElement = false; 
    } 
} 

public MeasureLists getMeasureLists() { 
    return measureLists; 
} 
} 

我的問題是,該代碼檢測的事件(開始和結束標記)正常,但變量localName是空String。如果「命名空間處理未執行」,我在文檔中閱讀了localName爲空。我的問題是什麼意思,我該如何處理。感謝您的幫助和提示。

編輯

我注意到,當我改變「QNAME」「的localName」變量那裏所有的東西去正確的,我也沒問題。你知道這是什麼嗎?

+0

這裏的一個更大的問題是字符方法。 –

回答

2

我的猜測是,你的XML使用命名空間,但你的SAXParser沒有配置命名空間處理(在這種情況下,限定元素,「前綴:的localName ',出現在qName參數中)。如果您使用JAXP,請將上的namespaceAware屬性設置爲true。爲了確保你的處理正確的元素,你還應該檢查uri參數是你期望的(或者應該期望的)。

您還有一個characters方法的問題。即使元素僅包含文本,caharacters()方法也可以針對每個元素多次調用。你需要做的是使用StringBuidler來收集字符,並在enedELement方法中使用它。

4

XML命名空間包含2部分結構,一部分稱爲URI,第二部分稱爲localName。例如。將

html:va xmlns:html="www.google.com" 

這裏,URIwww.google.comlocalNameVA。這些在XML的開始標籤中指定。在你的情況下,你的XML的命名空間看起來有些不妥。這可能是你得到這個問題的原因。

更多信息可以在這裏找到:

http://www.saxproject.org/namespaces.html