7

私は次のDOMを持っています

    <row>
        <link href="B&#252;ro.txt" target="_blank">
            my link
        </link>
    </row>

Java XmlSerializerを使用してファイルにシリアル化すると、次のようになります。

    <row>
        <link href="B&amp;#252;ro.txt" target="_blank">
            my link
        </link>
    </row>

XmlSerializerが属性のエスケープを処理する方法を制御する方法はありますか?これを別の方法で行う必要がありますか?

アップデート

また、jre1.6を使用しているとも言えます。私は最近までjre1.5を使用していましたが、「正しく」シリアル化されたと確信しています(つまり、「&」はエスケープされませんでした)。

明確化

DOMはプログラムで作成されます。次に例を示します。

        Document doc = createDocument();
        Element root = doc.createElement("root");
        doc.appendChild(root);
        root.setAttribute("test1", "&#234;");
        root.setAttribute("test2", "üöä");
        root.appendChild(doc.createTextNode("&#234;"));

        StringWriter sw = new StringWriter();

        serializeDocument(doc, sw);
        System.out.println(sw.toString());

私のソリューション では、かなりの量のコード変更とテストが必要だったため、これを実行したくありませんでしたが、属性データをCDATA要素に移動することにしました。問題は回避されました。

4

2 に答える 2

4

問題は、XML規則に従ってすでに「エスケープ」されている属性値を使用してDOMを構築していることです。DOMは(もちろん)あなたがこれを行ったことを認識せず、アンパサンドをエスケープしています。

変更する必要があります

root.setAttribute("test1", "&#234;");

root.setAttribute("test1", "\u00EA");

つまり、DOMを構築するときは、プレーンなUnicodeコードポイントで構成される文字列を使用します。XMLSerializerは、出力ドキュメントに選択された文字エンコードに応じて、必要に応じてUnicode文字を文字エンティティに置き換える必要があります。

編集-出力XMLに文字エンティティではなく生の文字が表示される可能性がある理由は、XMLSerializerがXMLのデフォルトのエンコーディングを使用しているためです。つまり、UTF-8です。これに対処する方法は、コンストラクターを使用して、XMLに必要な文字エンコードを指定するXMLSerializer(OutputFormat)を渡すことです。OutputFormat(「ASCII」を使用しているようです。)と互換性のある文字エンコードを使用してくださいOutputStream

于 2010-06-14T06:35:52.450 に答える
2

どうやってDOMを入手しますか?それと関係があるのでしょうか?私は、Sun Java 6と最新のXerces-J(2.9.1)を使用して、標準のDocumentBuilder(b / cに精通しています)でサンプルXMLを試しました。これは、LSSerializerまたはTrAXを優先してXmlSerializerを廃止します。

とにかく、この手法を使用すると、シリアル化されたドキュメントには文字参照すら含まれなくなり、「Büro.txt」に変換されます。次のコードを使用しました。

String xml = "<row>\n"
    + "        <link href=\"B&#252;ro.txt\" target=\"_blank\">\n"
    + "            my link\n" + "        </link>\n" + "    </row>";

InputStream is = new ByteArrayInputStream(xml.getBytes());
Document doc = DocumentBuilderFactory.newInstance()
    .newDocumentBuilder().parse(is);

XMLSerializer xs = new XMLSerializer();
xs.setOutputCharStream(new PrintWriter(System.err));

xs.serialize(doc);
于 2010-06-09T08:14:38.530 に答える