0

Java には、入出力用のストリームがあります。

ストリームを作成するとき、それはストリーム内のデータですか、それともデータのパイプラインだけですか?

実際、残りのリクエストから作成されたxmlレスポンスを、xmlレスポンスを返すWebサービスに解析しようとしています。

//Parse Xml
ParseXml parser=new ParseXml();

parser.parseStream(connection.getInputStream());

ここで、connection は HttpURLConnection オブジェクトです。

以下は parseStream() のソースです

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

public class ParseXml 
{
    public void parseStream(InputStream input)
    {
        XMLReader xmlReader;

        try 
        {
            xmlReader = (XMLReader) XMLReaderFactory.createXMLReader();
            xmlReader.setContentHandler(new XmlParser());

            xmlReader.parse(new InputSource(input));
        } 
        catch (SAXException e) 
        {
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }




    }


}

例外が発生しています:

[Fatal Error] :1:1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at xmlparsing.ParseXml.parseStream(ParseXml.java:24)
    at smssend.SmsSend.restHttpPost(SmsSend.java:129)
    at main.SmsApiClass.main(SmsApiClass.java:28)
4

2 に答える 2

1

anInputStreamは、データを読み取ることができるものです。これをデータ ソースと呼ぶこともできますが、パイプラインとは呼びません。私にとって、パイプラインには、くっついた複数のパーツが含まれます。

パーサー エラーについて: データをパーサーに直接送る前に、データをファイルまたはSystem.outに書き込んで、データが実際に到着したことを確認する必要があります。

次に、そのデータをパーサーにフィードして、既知のデータをフィードするとどうなるかを確認する必要があります。

これら 2 つのケースが適切に機能する場合は、データを直接フィードできます。

[2011-03-12 更新]

これは私にとってうまくいく完全な例です。たぶん、コードの違いを見つけることができます(特に、を作成する部分ではなく、一部のみを投稿しましたInputStream):

package so5281746;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class ParseXml {

  public static void parseStream(InputStream input) {
    try {
      XMLReader xmlReader = XMLReaderFactory.createXMLReader();
      xmlReader.setContentHandler(new XmlParser());
      xmlReader.parse(new InputSource(input));
    } catch (SAXException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

  }

  public static void main(String[] args) throws IOException {
    URLConnection conn = new URL("http://repo1.maven.org/maven2/org/apache/ant/ant/maven-metadata.xml").openConnection();
    InputStream input = conn.getInputStream();
    parseStream(input);
  }

  static class XmlParser extends DefaultHandler {

    @Override
    public void startDocument() throws SAXException {
      System.out.println("startDocument");
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
      System.out.println("startElement " + localName);
    }

    @Override
    public void endDocument() throws SAXException {
      System.out.println("endDocument");
    }
  }

}
于 2011-03-12T09:52:06.393 に答える
0

Java には「データ」などというものはなく、「オブジェクト」しかありません。他のすべてと同様に、InputStream はオブジェクトです。データへのアクセスを可能にする read() などのメソッドがあります。それがデータであるかどうかを尋ねるのは無意味な質問です。オブジェクト指向言語の原則では、データは常に read() インターフェイスなどのインターフェイスの背後に隠されています。

于 2011-03-12T22:58:53.700 に答える