9

コンテンツ自体が HTML である Stax を使用して XML データを書き込もうとしています。

私が試したら

xtw.writeStartElement("contents");
xtw.writeCharacters("<b>here</b>");
xtw.writeEndElement();

私はこれを得る

<contents>&lt;b&gt;here&lt;/b&gt;</contents>

次に、CDATA メソッドに気付き、コードを次のように変更します。

xtw.writeStartElement("contents");
xtw.writeCData("<b>here</b>");
xtw.writeEndElement();

そして今回の結果は

<contents><![CDATA[<b>here</b>]]></contents>

これはまだ良くありません。私が本当に欲しいのは

<contents><b>here</b></contents>

CDATAセクションにいなくても生のテキストを書くことができるXML API/ライブラリはありますか? これまでのところ、私は Stax と JDom を見てきましたが、これを提供していないようです。

最終的には古き良き StringBuilder に頼るかもしれませんが、これはエレガントではありません。

アップデート:

これまでの回答にほぼ同意します。ただし<b>here</b>、1MB の HTML ドキュメントをより大きな XML ドキュメントに埋め込みたいと考えています。あなたが提案したことは、その構造を理解するためにこの HTML ドキュメントを解析する必要があることを意味します。できればこれは避けたいです。

答え:

そうしないと、無効な XML ドキュメントが作成される可能性があります。

4

7 に答える 7

3

問題は、生のテキストではなく要素であるため、書く必要があることです

xtw.writeStartElement("contents");
xtw.writeStartElement("b");
xtw.writeCData("here");
xtw.writeEndElement();
xtw.writeEndElement();
于 2010-06-08T10:20:41.740 に答える
1

XML を文字データとしてではなく、AS XML として含める場合は、ある時点で解析する必要があります。自分で解析を手動で行いたくない場合は、次の 2 つの方法があります。

(1) 外部の解析済みエンティティを使用します。この場合、外部ファイルが取り込まれ、XML パーサーによって解析されます。出力が再度シリアル化されると、外部ファイルの内容が含まれます。

[ http://www.javacommerce.com/displaypage.jsp?name=entities.sql&id=18238を参照]

(2) Xinclude を使用します。この場合、xinclude 参照を出力にマージする xinclude プロセッサを介してファイルを実行する必要があります。ほとんどの xslt プロセッサは、xmllint と同様に、適切なオプションを指定して xinclude も実行します。

[参照: http://www.xml.com/pub/a/2002/07/31/xinclude.html ]

( XSLT を使用して、XInclude 構文を使用せずにドキュメントをマージすることもできます。XInclude は標準構文を提供するだけです )

于 2010-06-08T17:31:44.700 に答える
0

html のブロブが実際に xhtml である場合は、(疑似コードで) 次のようなことをお勧めします。

xtw.writeStartElement("contents")
XMLReader  xtr=new XMLReader();
xtr.read(blob);
Dom dom=xtr.getDom();
for(element e:dom){
    xtw.writeElement(e);
}
xtw.writeEndElement();

またはそのようなもの。私は一度似たようなことをしなければなりませんでしたが、別のライブラリを使用しました。

于 2010-06-08T20:27:47.263 に答える
0

XML と HTML が大きすぎない場合は、回避策を講じることができます。

xtw.writeStartElement("contents");
xtw.writeCharacters("anUniqueIdentifierForReplace"); // <--
xtw.writeEndElement();

XML を文字列として持っている場合:

xmlAsString.replace("anUniqueIdentifierForReplace", yourHtmlAsString);

あまり良くないことはわかっていますが、これはうまくいく可能性があります。


編集:もちろん、有効かどうかを確認する必要yourHtmlAsStringがあります。

于 2010-06-08T10:36:56.433 に答える
0

大きな HTML ドキュメントを XML ドキュメントに埋め込みたい場合は、CDATA imho が最適です。そうすれば、内部構造を理解したり処理したりする必要がなくなり、後で文書タイプを HTML から別のものに簡単に変更できます。また、たとえば DOCTYPE 命令を直接 (つまり、DOCTYPE 命令のセマンティクスを保持する構造化データとして) 埋め込むことはできないと思います。それらは文字として表現する必要があります。

(これは主にあなたの更新への応答ですが、悲しいことに、コメントするのに十分な担当者がいません....)

于 2010-06-08T10:44:48.647 に答える
0

問題は「ここ」ではなく、<b></b>.

要素をコンテンツの子として追加する<b>と、それが可能になります。JDOM や DOM4J などのどのライブラリでも、これを行うことができます。一般的なケースは、コンテンツを XML DOM に解析し、ルート要素を の子として追加することです<contents>

CDATA セクションの外にエスケープ値を追加することはできません。

于 2010-06-08T10:19:45.600 に答える
0

出力に挿入する XML の大きなブロックを解析する際に、何が問題なのかわかりません。StAX パーサーを使用して解析し、すべてのイベントを既存のシリアライザー (変数 "xtw") に転送するコードを記述します。

于 2010-06-08T18:41:24.927 に答える