2012-09-17 73 views
1

嗨,大家目前正在研究需要解析xml文檔以驗證用戶的應用程序。使用java.net。*包的URLConnection類來連接到特定的URL以xml格式返回其響應。當我嘗試解析使用JDOM文檔時,我得到以下錯誤:
org.jdom2.input.JDOMParseException: Error on line 1: Premature end of fileXML從輸入流解析Java

誰能找出問題所在,並協助我有辦法補救嗎?謝謝,這裏是我的部分代碼

try { 
    String ivyString = "http://kabugi.hereiam.com/?username=" + ivyUsername + "&password=" + ivyPassword; 

    URL authenticateURL = new URL(ivyString); 
    URLConnection ivyConnection = authenticateURL.openConnection(); 
    HttpURLConnection ivyHttp = (HttpURLConnection) ivyConnection; 
    System.out.println("Response code ==>" + ivyHttp.getResponseCode()); 
    if (ivyHttp.getResponseCode() != 200) { 
    ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid username or password!", "")); 
    page = "confirm.xhtml"; 
    } else { 
    BufferedReader inputReader = new BufferedReader(new InputStreamReader(ivyConnection.getInputStream())); 
    String inline = ""; 
    while ((inline = inputReader.readLine()) != null) { 
     System.out.println(inline); 
    } 
    SAXBuilder builder = new SAXBuilder(); 

    Document document = (Document) builder.build(ivyConnection.getInputStream()); 
    Element rootNode = document.getRootElement(); 
    List list = rootNode.getChildren("data"); 
    for (int i = 0; i < list.size(); i++) { 
     Element node = (Element) list.get(i); 
     System.out.println("Element data ==>" + node.getChildText("username")); 
     System.out.println("Element data ==>" + node.getChildText("password")); 

    } 

    page = "home.xhtml"; 
    } 
} catch (Exception ex) { 
    ex.printStackTrace(); 
    // ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid username or password!", "")); 
} 
+1

這個問題可以簡單地通過InputStream中返回的數據是錯誤格式XML - 你檢查的實際內容? –

+0

正如@mattb所述,您檢索的內容可能不是有效的XML文檔。爲了解析HTML頁面,您可以使用更靈活的庫,例如JSoup,請參閱:http://jsoup.org – Alex

+0

或者您可以使用流暢的API「RestAssured」或另一個名爲「RestEasy」的項目... – djangofan

回答

1

我以前有過類似這個問題。如果它是一個未壓縮的HTTP連接,你可以使用Wireshark對數據包進行跟蹤。您可能會發現的是,在XML響應數據的開頭處有一個意外的XML BOM標題(其他問題)。例如,如果您使用的HTTP庫不支持http分塊或者xml是錯誤的編碼,則可能會發生這種情況。

直到您使用數據包嗅探器分析流量並確定BOM頭(或缺少BOM頭)時,我們纔會知道。在任何情況下,如果出現問題,您可以對該流進行破解以考慮BOM頭。

+0

感謝djangofan,我怎麼用這個來解決這個問題? – bugiman

+0

是否意味着問題是由xml響應中的編碼聲明造成的? – bugiman

+0

這就是我的想法,但有可能是另一個原因。您需要將數據包跟蹤它以確認,或者在將流傳遞給構建器之前將其打印到控制檯。 – djangofan

3

看起來像它,因爲你正在閱讀輸入流兩次。一旦打印,然後建立文檔。當您到達構建Document對象的位置時,輸入流已經完全讀取並在其結尾。試試下面的代碼讀取數據流只有一次

 BufferedReader inputReader = new BufferedReader(new InputStreamReader(ivyConnection.getInputStream())); 
     StringBuilder sb = new StringBuilder(); 
     String inline = ""; 
     while ((inline = inputReader.readLine()) != null) { 
      sb.append(inline); 
     } 

     System.out.println(sb.toString()); 
     SAXBuilder builder = new SAXBuilder(); 

     Document document = (Document) builder.build(new ByteArrayInputStream(sb.toString().getBytes())); 
0
Using sax parse you can read the inputstream. 
SAXParserFactory spf = SAXParserFactory.newInstance(); 
SAXParser sp = spf.newSAXParser(); 
ParseCustomer parseEventsHandler=new ParseCustomer(); 
sp.parse(ivyHttp.getInputStream(),parseEventsHandler); 

Here ParseCustomer is the parse class that will read xml. Given sample is: 

class ParseCustomer extends DefaultHandler{ 
      @Override 
     public void startDocument() throws SAXException { 
      // TODO Auto-generated method stub 
      super.startDocument(); 
     } 
      @Override 
     public void startElement(String uri, String localName, String qName, 
       Attributes attributes) throws SAXException { 
      // TODO Auto-generated method stub 
      super.startElement(uri, localName, qName, attributes);`enter code here` 
      if (qName.equals("frameit")) { 
       // compare element name and get value/ for further help read saxparser 
       orderId=atts.getValue("orderId"); 
         } 
      System.out.println(qName); 

     } 
      @Override 
     public void endElement(String uri, String localName, String qName) 
       throws SAXException { 
      // TODO Auto-generated method stub 
      super.endElement(uri, localName, qName); 
     } 

      @Override 
     public void characters(char[] ch, int start, int length) 
       throws SAXException { 
      // TODO Auto-generated method stub 
      super.characters(ch, start, length); 
     } 

     }