escapeXml
関数は変換ѭ Ѯ
されているはずですが、変換ѭ Ѯ
すべきではないと思います。私が読んだのは、5つの基本的なXMLエンティティ(、、、、、)のみをサポートしているというgt
ことです。lt
quot
amp
apos
これらの5つの基本的なxmlエンティティのみを変換する関数はありますか?
escapeXml
関数は変換ѭ Ѯ
されているはずですが、変換ѭ Ѯ
すべきではないと思います。私が読んだのは、5つの基本的なXMLエンティティ(、、、、、)のみをサポートしているというgt
ことです。lt
quot
amp
apos
これらの5つの基本的なxmlエンティティのみを変換する関数はありますか?
public String escapeXml(String s) {
return s.replaceAll("&", "&").replaceAll(">", ">").replaceAll("<", "<").replaceAll("\"", """).replaceAll("'", "'");
}
ライブラリの3.1バージョンのjavadocには次のように書かれています。
0x7fより大きいUnicode文字は3.0以降であり、エスケープされなくなったことに注意してください。それでもこの機能が必要な場合は、次の方法で実現できます。StringEscapeUtils.ESCAPE_XML.with(NumericEntityEscaper.between(0x7f、Integer.MAX_VALUE));
したがって、おそらく古いバージョンのライブラリを使用します。依存関係を更新します(またはエスケープを自分で再実装します:ロケット科学ではありません)
のjavadocは、使用する必要があるStringEscapeUtils.escapeXml
と言っています
StringEscapeUtils.ESCAPE_XML.with( new UnicodeEscaper(Range.between(0x7f, Integer.MAX_VALUE)) );
ただし、の代わりにをUnicodeEscaper
使用NumericEntityEscaper
する必要があります。UnicodeEscaper
すべてを\u1234
シンボルに変更しますが、予想どおりにNumericEntityEscaper
エスケープし&#123;
ます。
package mypackage;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.text.translate.CharSequenceTranslator;
import org.apache.commons.lang3.text.translate.NumericEntityEscaper;
public class XmlEscaper {
public static void main(final String[] args) {
final String xmlToEscape = "<hello>Hi</hello>" + "_ _" + "__ __" + "___ ___" + "after "; // the line cont
// no Unicode escape
final String escapedXml = StringEscapeUtils.escapeXml(xmlToEscape);
// escape Unicode as numeric codes. For instance, escape non-breaking space as  
final CharSequenceTranslator translator = StringEscapeUtils.ESCAPE_XML.with( NumericEntityEscaper.between(0x7f, Integer.MAX_VALUE) );
final String escapedXmlWithUnicode = translator.translate(xmlToEscape);
System.out.println("xmlToEscape: " + xmlToEscape);
System.out.println("escapedXml: " + escapedXml); // does not escape Unicode characters like non-breaking space
System.out.println("escapedXml with unicode: " + escapedXmlWithUnicode); // escapes Unicode characters
}
}
UTF-8の時代には、読み取り可能な文字を含むXMLドキュメントが好まれることがあります。これは機能するはずであり、再構成はString
1回だけ行われます。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
private static final Pattern ESCAPE_XML_CHARS = Pattern.compile("[\"&'<>]");
public static String escapeXml(String s) {
Matcher m = ESCAPE_XML_CHARS.matcher(s);
StringBuffer buf = new StringBuffer();
while (m.find()) {
switch (m.group().codePointAt(0)) {
case '"':
m.appendReplacement(buf, """);
break;
case '&':
m.appendReplacement(buf, "&");
break;
case '\'':
m.appendReplacement(buf, "'");
break;
case '<':
m.appendReplacement(buf, "<");
break;
case '>':
m.appendReplacement(buf, ">");
break;
}
}
m.appendTail(buf);
return buf.toString();
}