1

さて、これが私の問題です。別のアプリケーションに渡すために、Java で xml を生成する必要があります。org.w3c.dom.Document を使えば簡単だろうと考え始めました。残念ながら、XML を渡す必要があるアプリケーションでは、" のような特殊文字を文字エンティティ (") ではなく ASCII (") としてエンコードする必要があります。これに対する簡単な解決策を知っている人はいますか?

PS ターゲット アプリケーションを変更することはできません。

更新:だから、私のアプリに次の文字列が入力として与えられたとしましょう:

he will "x" this if needed

私のアプリはこれを出力する必要があります:

<field value="he will &#034;x&#034; this if needed"/>

私が使用している XML ジェネレーターは、他のほとんどがこれを出力すると推測していますが、これは私のターゲットには有効ではありません。

<field value="he will &quot;x&quot; this if needed"/>

私のターゲットが XML 標準に完全に準拠していない可能性があることは認識していますが、それを制御できないため、それは役に立ちません。これは私の状況であり、対処しなければなりません。すべての特殊文字を手動で変換する以外のアイデアはありますか?

4

2 に答える 2

2

XML を文字列やストリームなどにどのようにシリアル化するのだろうかと思います。出力を後処理して、一般的なエンティティ参照を同等の数値に置き換えることができます。

sed 's/&lt;/\&#60;/g; s/&gt;/\&#62;/g; s/&amp;/\&#38;/g; s/&apos;/\&#39/g; s/&quot;/\&#34;/g'

また

xmlResultString.replaceAll("&lt;", "&#60;"); //etc. for other entities

XML ( http://www.w3.org/TR/REC-xml/#sec-predefined-ent )には正確に 5 つの事前定義された一般エンティティがあり、これをテキスト置換として安全に実行できます。参照以外のものを変更する危険はありません (まあ、コメントや PI かもしれませんが、シナリオでそれらが使用されているようにも、ターゲットがそれらを受け入れているようにも聞こえません)。

私は、あなたのターゲット アプリケーションが適合する XML プロセッサではないというマークに同意します。少なくとも、XML との相違点を明示したドキュメントが付属しています。推奨事項(上記のリンク)はクリストファーのコメントに同意しないと思いますが、OPの質問とは無関係ですが、彼のターゲットは推奨事項への不適合を宣言しています。

アリ。

于 2010-02-13T01:52:14.123 に答える
1

私の知る限り、標準 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 &#34;x&#34; this if needed" />

(これを行う前にXML 仕様をもう一度見直し、 U+FFFF を超える文字をサポートするように文字処理を修正します。)

于 2010-01-29T17:27:27.747 に答える