文字エンティティの代わりにASCIIエンコードを使用してXMLをエンコードします
-
23-09-2019 - |
質問
さて、ここに私の問題があります。 JavaでXMLを生成して、別のアプリケーションに渡す必要があります。私はこれがorg.w3c.dom.documentを使用するのが簡単だと思い始めました。残念ながら、XMLを渡す必要があるアプリケーションでは、「キャラクターエンティティ(」)の代わりに「ASCII(」)のような特殊なキャラクターをエンコードする必要があります。これに対する簡単な解決策を知っている人はいますか?
PSターゲットアプリケーションの変更はオプションではありません。
更新:それで、私のアプリに次の文字列が入力として与えられたとしましょう。
he will "x" this if needed
私のアプリはこれを出力する必要があります:
<field value="he will "x" this if needed"/>
私が使用しているXMLジェネレーターであり、他のほとんどはこれを出力していると推測していますが、これは私のターゲットには有効ではありません。
<field value="he will "x" this if needed"/>
私のターゲットはXML標準まではまったく存在しない可能性があることに気付きましたが、それを制御できないので、それは私を助けません。これが私の状況であり、私はそれに対処しなければなりません。すべての特別なキャラクターを手で変換する以外のアイデアはありますか?
解決
XMLをどのようにシリアル化しますか?文字列、ストリームなど。出力を後処理して、一般的なエンティティの参照を数値相当の等価物に置き換えることができます。
sed 's/</\</g; s/>/\>/g; s/&/\&/g; s/'/\'/g; s/"/\"/g'
また
xmlResultString.replaceAll("<", "<"); //etc. for other entities
XMLには正確に5つの事前定義された一般的なエンティティがあります(http://www.w3.org/tr/rec-xml/#sec-predefined-ent)そして、これをテキストの置き換えとして安全に実行できます。参照以外のものを変更する危険はありません(まあ、おそらくコメントやPIでは、シナリオがそれらを使用したり、ターゲットがそれらを受け入れるようには聞こえません)。
ターゲットアプリケーションは適合XMLプロセッサではないことにマークに同意します。少なくとも、XMLから分岐する場所を明示的に述べるドキュメントが付属しています。推奨事項(上記のリンク)はクリストファーのコメントに同意しないと思いますが、OPのターゲットが勧告に対する不適合を宣言しているため、OPの質問とは無関係です。
アリ。
他のヒント
私の知る限り、標準のAPIはエスケープメカニズムを公開しません。おそらく独自のXMLエミッターを書く必要があります。
サードパーティのAPIを気にしない場合は、使用できます jdom. 。何かのようなもの:
XMLOutputter outputter = new XMLOutputter() {
@Override
public String escapeAttributeEntities(String sequence) {
// TODO: bug: code only works for Basic Multilingual Plane
StringBuilder out = new StringBuilder();
for (int i = 0; i < sequence.length(); i++) {
process(sequence.charAt(i), out);
}
return out.toString();
}
private void process(char codePoint, StringBuilder out) {
if (codePoint == '"' || codePoint == '\'' || codePoint == '&'
|| codePoint == '<' || codePoint == '>' || codePoint > 127) {
out.append("&#");
out.append(Integer.toString(codePoint));
out.append(";");
} else {
out.append(codePoint);
}
}
};
outputter.setFormat(Format.getPrettyFormat().setEncoding("US-ASCII"));
Element foo = new Element("foo").setAttribute("msg",
"he will \"x\" this if needed");
Document doc = new Document().setRootElement(foo);
outputter.output(doc, System.out);
これは排出されます:
<?xml version="1.0" encoding="US-ASCII"?>
<foo msg="he will "x" this if needed" />
(私はまだ与えます XML仕様 これを行う前に1回、キャラクターの取り扱いを修正してキャラクターをサポートします 上記のu+ffff.)