解析しようとしていますXML response
、しかし、私は悲惨に失敗しています。最初はxml
が応答で返されていないと考えていたので、オンラインでxml
ファイルへの直接リンクを使用して以下のコードを作成しました。 XML
を問題なく画面に印刷できます。ただし、解析メソッドを呼び出すと、ファイルの早すぎる終了
URLを直接渡すと機能します:
しかし、InputStreamを渡すと失敗します。
builder.parse(connection.getInputStream());
try {
URL url = new URL(xml);
URLConnection uc = url.openConnection();
HttpURLConnection connection = (HttpURLConnection )uc;
connection.setDoInput(true);
connection.setDoOutput(true);
InputStream instream;
InputSource source;
//get XML from InputStream
if(connection.getResponseCode()>= 200){
connection.connect();
instream = connection.getInputStream();
parseDoc(instream);
}
else{
instream = connection.getErrorStream();
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
static void parseDoc(InputStream instream) throws ParserConfigurationException,
SAXException, IOException{
BufferedReader buff_read = new BufferedReader(new InputStreamReader(instream,"UTF-8"));
String inputLine = null;
while((inputLine = buff_read.readLine())!= null){
System.out.println(inputLine);
}
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
factory.isIgnoringElementContentWhitespace();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(instream);
}
私が得ているエラー:
[Fatal Error] :1:1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
at com.Sun.org.Apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.Sun.org.Apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at com.ameba.api.network.MainApp.parseDoc(MainApp.Java:78)
at com.ameba.api.network.MainApp.main(MainApp.Java:41)
これを行うと、
while((inputLine = buff_read.readLine())!= null){
System.out.println(inputLine);
}
インストリームですべてを消費するため、インストリームは空です。これをしようとすると、
Document doc = builder.parse(instream);
空のストリームを渡したため、解析は失敗します。
SAXBuilderが「空白状態」を処理するのに十分にインテリジェントではないため、エラーが発生しています。したがって、少なくとも<xml ..>
宣言、およびそれがデータなし応答を引き起こすと、空の状態を報告するのではなく、表示される例外を作成します。
回答のためにこの投稿に到達した人のために:
これは主に、DOMパーサーが消費しているInputStream
が空であるために発生します
だから私が出会ったものには、2つの状況があるかもしれません:
InputStream
が使用されたため、空になりました。File
またはInputStream
を作成したものは、空のファイルまたは文字列などです。空虚が問題の原因である可能性があります。したがって、InputStream
のソースを確認する必要があります。私は同じエラーに出くわし、例外をログに記録することで問題を簡単に見つけることができました。
documentBuilder.setErrorHandler(new ErrorHandler() {
@Override
public void warning(SAXParseException exception) throws SAXException {
log.warn(exception.getMessage());
}
@Override
public void fatalError(SAXParseException exception) throws SAXException {
log.error("Fatal error ", exception);
}
@Override
public void error(SAXParseException exception) throws SAXException {
log.error("Exception ", exception);
}
});
または、エラーをログに記録する代わりに、throw
itおよびcatch
itでエントリを処理することができます。そのため、エントリ自体を印刷して、エラーに関するより良い指示を得ることができます。
他の理由の1つは、mongodb設定でIPアドレス(IPv4)をホワイトリストに登録する必要があることです。それが解決することを願っています!