2011-10-31 67 views
-1

所有,下面的代碼拋出一個NullPointerException。SAX Parser問題NullPointer

 SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser sp = spf.newSAXParser(); 

     XMLReader xr = sp.getXMLReader(); 

     dataHandler dataHandler = new dataHandler(); 
     xr.setContentHandler(dataHandler); 

xmldata="<ArrayOfNacionalClass xmlns="http://schemas.datacontract.org/2004/07/ServiceCompras" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><NacionalClass><ProdutoName>Batata Congelada Pré Frita Perdigão 400g</ProdutoName><ProdutoPreco>2,50</ProdutoPreco></NacionalClass><NacionalClass><ProdutoName>Iogurte Polpa Morango Batavo 540g</ProdutoName><ProdutoPreco>2,20</ProdutoPreco></NacionalClass><NacionalClass><ProdutoName>Protetor Solar Loção FPS 15 Sundown 120ml</ProdutoName><ProdutoPreco>16,83</ProdutoPreco></NacionalClass><NacionalClass><ProdutoName>Costela Bovina Resfriada por kg com Peso Aprox. 1,250 Kg</ProdutoName><ProdutoPreco>10,87</ProdutoPreco></NacionalClass><NacionalClass><ProdutoName>Refrigerante Pepsi 2 Litros</ProdutoName><ProdutoPreco>2,99</ProdutoPreco></NacionalClass><NacionalClass><ProdutoName>Pizza Mussarela Ristorante 340g</ProdutoName><ProdutoPreco>5,98</ProdutoPreco></NacionalClass><NacionalClass><ProdutoName>Néctar de Uva Del Valle Mais 1,5L</ProdutoName><ProdutoPreco>4,99</ProdutoPreco></NacionalClass><NacionalClass><ProdutoName>Batata Original Ruffles 400g</ProdutoName><ProdutoPreco>11,70</ProdutoPreco></NacionalClass><NacionalClass><ProdutoName>Bolo de Chocolate Granulado por kg com Peso Aprox. 0,500 Kg</ProdutoName><ProdutoPreco>14,00</ProdutoPreco></NacionalClass><NacionalClass><ProdutoName>Sorvete Especial Diamante Negro Kibon 2L</ProdutoName><ProdutoPreco>15,38</ProdutoPreco></NacionalClass><NacionalClass><ProdutoName>Bebida Láctea Nescau Fast Nestlé 300ml</ProdutoName><ProdutoPreco>2,38</ProdutoPreco></NacionalClass><NacionalClass><ProdutoName>Cerveja Pilsen Nova Schin 473ml</ProdutoName><ProdutoPreco>1,69</ProdutoPreco></NacionalClass><NacionalClass><ProdutoName>Lava Roupas Líquido Concentrado Omo Multiação 315ml</ProdutoName><ProdutoPreco>5,20</ProdutoPreco></NacionalClass><NacionalClass><ProdutoName>Kit Shampoo e Condicionador Controle de Queda 400ml Pantene Pro-V</ProdutoName><ProdutoPreco>17,00</ProdutoPreco></NacionalClass><NacionalClass><ProdutoName>Amaciante Comfort Original 500ml</ProdutoName><ProdutoPreco>5,00</ProdutoPreco></NacionalClass></ArrayOfNacionalClass>" 

InputSource is=new InputSource(new ByteArrayInputStream(xmldata.getBytes())); 



try { 
     xr.parse(is); 
    }catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 

老實說,我不明白爲什麼它給我空指針異常,我也試過usind stringreader而不是ByteArray的,沒有運氣

請help..thanks

+1

'dataHandler dataHandler = new dataHandler(); '沒有任何意義。這永遠不會編譯。課程以大寫字母開頭。你還可以發佈異常的堆棧跟蹤嗎? – Stephan

+0

10-31 21:29:44.043:WARN/System.err(364):org.xml.sax.SAXException:未指定任何輸入。 –

回答

0

當我使用的SAXParser我發現,我需要在工作前將XML標題添加到我的文件中,並且還需要將所有數據都包含在單個頂級標記中,例如

private static final String XML_HEADER = "<?xml version=\"1.0\"?><z>"; 
    private static final String XML_FOOTER = "</z>" 

    String xmldata = XML_HEADER + 
        "<ArrayOfNacionalClass ... your data >" + 
        XML_FOOTER; 
    sp.parse(new ByteArrayInputStream(xmldata.getBytes("UTF-8")), 
      this); 

你可能不需要<z></z>件以上,如果所有的數據將永遠在你的頂級ArrayOfNacionalClass標籤包圍。

<ArrayOfNacionalClass>your data</ArrayOfNacionalClass> 

如果你離開我的<z></z>標籤,那麼你就需要來處理它們在你的DefaultHandler類。

如果沒有任何幫助,這裏是爲您可能會發現有用的一個SAXParser的一些示例代碼:
http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

你已經發布的代碼看起來並不像它將會編譯,除非這是你的自己的dataHandler類?如果是這種情況,那麼你也應該發佈代碼。

我建議您使用IDE,它可以幫助您在輸入時修復編譯錯誤(例如Eclipse)。

+0

其實datahandler是一個擴展了DefaultHandler的類,它編譯時,我改了名字以避免混淆 –

+0

我仍然得到NullPointer ....起初我以爲我的XML格式不正確,但它不是,如果我檢查SystemID和PublicID的InputSource變量爲空。有趣的是,ByteStream屬性擁有所有的數據。 –

+0

您是否在上述更新的答案中嘗試了我的建議?絕對先從非常簡單的數據開始! –