7

私は、Java を使用して TCP ポートに接続し、XML ドキュメントを次々とストリーミングする立場にあり、それぞれ<?xmlがドキュメントタグの開始で区切られています。フォーマットを示す例:

<?xml version="1.0"?>
<person>
    <name>Fred Bloggs</name>
</person>
<?xml version="1.0"?>
<person>
    <name>Peter Jones</name>
</person>

私はorg.xml.sax.*アピを使用しています。SAX 構文解析は、最初のドキュメントでは完全に機能しますが、2 番目のドキュメントの先頭に到達すると例外がスローされます。

Exception in thread "main" org.xml.sax.SAXParseException: The processing instruction 
target matching "[xX][mM][lL]" is not allowed.

次のスケルトン クラスは、私が使用しているセットアップを示しています。

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

import java.io.FileReader;

public class XMLTest extends DefaultHandler {

  public XMLTest() {
     super();
  }

  public static void main(String[] args) throws Exception {
    XMLReader xr = XMLReaderFactory.createXMLReader();

    XMLTest handler = new XMLTest();
    xr.setContentHandler(handler);
    xr.setErrorHandler(handler);

    xr.parse(new InputSource(new Socket("127.0.0.1", 4555).getInputStream()));
  }
}

xml の形式 (財務データ フィード) を制御することはできませんが、効率的に解析し、すべてのドキュメントを解析できるようにする必要があります。私は午後/夕方にさまざまなことを試しましたが、結果は得られませんでした. どんな助けでも大歓迎です。

4

1 に答える 1

7

<?xml version="1.0"?>ストリームをすべてに分割し、それらをすべて個別に解析したいとします。これBufferedReaderには が役立つ場合があります。キックオフの例:

reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
StringBuilder builder = null;
for (String line; (line = reader.readLine()) != null;) {
    if (line.startsWith("<?xml")) {
        if (builder != null) {
            xr.parse(new InputSource(builder.toString()));
        }
        builder = new StringBuilder();
    }
    builder.append(line);
}
于 2010-07-21T18:49:55.137 に答える