9

Java で SAX API を使用して、ストリーム入力からのルート要素のない XML フラグメントのリストを解析することは可能ですか?

そのような XML を解析しようとしましたが、

org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed.

endDocument イベントが発生する前でさえありません。

「カスタムルート要素を事前に追加するか、バッファリングされたフラグメント解析を使用する」など、明白ではあるが不器用な解決策で解決したくありません。

Java 1.6 の標準 SAX API を使用しています。SAX ファクトリには、誰かが疑問に思った場合に備えて setValidating(false) がありました。

4

1 に答える 1

13

まず、最も重要なことですが、解析しているコンテンツはXML ドキュメントではありませんXML仕様から:

[定義:ルートまたはドキュメント要素と呼ばれる要素が 1 つだけ存在し、その一部が他の要素のコンテンツに表示されない。]

さて、これをSAXで解析することについては、不器用さについてあなたが言ったことにもかかわらず、次のアプローチをお勧めします。

Enumeration<InputStream> streams = Collections.enumeration(
    Arrays.asList(new InputStream[] {
        new ByteArrayInputStream("<root>".getBytes()),
        yourXmlLikeStream,
        new ByteArrayInputStream("</root>".getBytes()),
    }));

SequenceInputStream seqStream = new SequenceInputStream(streams);

// Now pass the `seqStream` into the SAX parser.

を使用するSequenceInputStreamと、複数の入力ストリームを 1 つのストリームに連結する便利な方法になります。それらは、コンストラクターに渡された順序で読み取られます (または、この場合は、によって返されますEnumeration)。

これを SAX パーサーに渡せば完了です。

于 2012-06-27T13:18:37.857 に答える