2

標準の Java オブジェクトを使用した XML 作成でかなり深刻な問題が発生しました。私のコードは次のとおりです。

//Generate DOM
DOMSource source = this.generateDomDocument(params...);

//WRITE XML FILE
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();

//Properties
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, STRING_FIELD_DTD);
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");

//Convert and write to disk
transformer.transform(source, new StreamResult(
                      new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8")));

問題は、トランスフォーマーが
、結果の XML に含まれてはならないエンティティのキ​​ャリッジ リターンを変換していることです。これは例です。いくつかの異なる言語で記述された翻訳を含む結果ファイルがあり (そのため、UTF-8 を使用します)、テキストに CarriageReturns が含まれている場合、それらはすべて同じです:

<content langID="EN">
                    <desc> Test string&#13;
do not copy.</desc>

物事を明確にするために、これは私が XML で期待していることです。

<content langID="EN">
                    <desc> Test string
do not copy.</desc>

Google とここでも問題を調べましたが、解決策や回避策はないようです。

4

1 に答える 1

0

多くの作業の結果、自分の問題に対する2つの解決策を見つけました。これらは、実際の解決策よりも多くの回避策です。

解決策1

FilterOutputStreamを拡張するクラスを作成し、不要なものを除いて、最終ストリーム(上記の場合はファイル)にすべての文字を書き込むために必要なメソッドを実装します。つまり&#13; 、ストリームに書き込むには、フィルターを追加するだけです。

 StreamResult result = new StreamResult(
                           new OutputStreamWriter(
                               new XMLFilterOutputStream(
                                   new FileOutputStream(filename)),"UTF-8"));
 transformer.transform(source, result);

解決策2

DOMツリーを作成するときは、\ r文字をエスケープするだけです(したがって、元のテキストからすべてのキャリッジリターンを削除します)。

String util = //original string data

Element desc = doc.createElement("desc");                   
Node text = doc.createTextNode((util!=null ? stringEscape(util).trim() : ""));
desc.appendChild(text);
externalElement.appendChild(desc);

そして、エスケープメソッドを次のように実行します。

private String stringEscape(String str){
    StringBuffer st = new StringBuffer(str);
    for(int i=0; i < st.length();i++){
        String s = st.substring(i,i+1);
        if("\r".equals(s)){
            st.replace(i,i+1,"");   
        }
    }
    return st.toString();
}

私は知っています、それは恐ろしいですが、動作します。

正しい解決策であるAFAIKは、XALANのHTMLEntitiesファイルにアクセスし、それを変更する必要があります。そのため、トランスフォーマーは一部のエンティティを省略します。

于 2012-07-10T13:20:10.420 に答える