2009-03-10 14 views
0

XMLファイルの断片を別々のファイルに保存したい。 それはまっすぐにそれをする方法がないようです: チャンクの読み込みが失敗します。XMLチャンクは有効ですか?

私はいつも例外を受け取ります "javax.xml.transform.TransformerException:org.xml.sax.SAXParseException:ルート要素に続くドキュメント内のマークアップは整形式でなければなりません。"

「ルート」要素が1つのみ(通常の意味ではルート要素ではない )である場合にのみ機能します。

私は、複数の「ルーツ」を持つXMLが整形式ではないことを理解していますが、 はチャンクとして扱う必要があります。

いくつかの回避策を提案する前に、私に教えてください: XMLチャンクはまったく有効ですか?

もしそうなら、標準のJDK6 APIを使って読み込むことができますか?

テストコード:

String testChunk1 = "<e1>text</e1>"; 
String testChunk2 = "<e1>text</e1><e2>text</e2>"; 

// the following doesn't work with 'testChunk2' 
StringReader sr = new StringReader(testChunk1); 
StringWriter sw = new StringWriter(); 

TransformerFactory.newInstance().newTransformer().transform(
    new StreamSource(sr), new StreamResult(sw)); 

System.out.println(sw.toString()); 

答えて

2

W3CはXML fragment interchangeのための標準を定義するに向けて取り組んできました。私はそれがあなたの問題の解決策ではないので言及していますが、そのようなことをどう対処するかについての議論があることは間違いありません。

.NETの世界では、XMLフラグメントで作業することができます(例:validate them against a schema)。これは、Javaライブラリで同様のサポートを探す価値があることを示しています。

このようなフラグメントをXSLTで変換する場合は、非常に一般的な方法として、ラッパー要素をその周りに配置し、DOMのルートとして機能させることがあります。

+0

XMLフラグメントインターチェンジの '現在の'バージョンは2001年のものであり、依然として「候補推薦」です(8年以来!)。だから、W3Cからそれ以上のことは期待できません。私は同様の話題についてW3Cが他の標準的な提案を見つけることができませんでした。何でも知ってますか?ありがとう。 –

1

私はあなたがやりたい、おそらく場しのぎいくつかの方法がなければならないと仮定しますが、私はそれを行うにはどのような方法を認識していないです。標準的なXMLパーサは、あなたが発見しているように整形式のXMLを期待しています。

異なるXMLファイルを別々のファイルに保存したい場合は、おそらく、独自のReaderまたはInputStreamを作成して実際に(舞台裏で)次に、ラップされたReaderまたはInputStreamをトランスに提供します。そうすれば、XMLパーサーは単一のXML文書を見ることができますが、必要に応じてXML文書を格納できます。

あなたはこのような何かを行う場合は、(非常に最初は除く)の断片は、標準のXMLヘッダーで始めることはできません。

<?xml version="1.0" encoding="UTF-8" ?> 
+0

は実際に彼がでとXMLせずにXMLファイルを読み込み、いくつかのInputStreamを作成することができますヘッダーを持つ単一のXMLファイルにそれらを結合します。 – Bombe

+0

私はそれについて考えていましたが、これは私が 回避策と呼ぶものです) 私はこれを最後のオプションとして使用すると思います。 –

1

いくつかの回避策を提案する前に、私に教えてください。XMLチャンクはまったく有効ですか?

エンティティ参照などのメソッドを使用して他のドキュメントに含めることができます(XML外部パースエンティティとして使用できます)。DOM Level 3 LSのparseWithContext()などのメソッドを使用して既存のドキュメントにチャンクとして解析できます。 Javaはあなたに申し訳ありません)、ドキュメントではありませんので、完全なドキュメントを必要とするインターフェイスはそれらを受け入れることができません。

XSLTは完全なドキュメントで動作し、ゼロ以上のルート要素を含むものと混同されるため、Transformerは完全なドキュメントを入力する必要があります。通常のトリックは、開始タグと終了タグでドキュメントを折り返して単一のルート要素を作成することですが、これはEddieが述べたようにXML宣言(*)を持つことができないことを意味します。

(*:実際には、外部解析対象実体に含まれますが、構文はまったく同じである「テキスト宣言」として知られています。)

関連する問題