好的,所以这是我的问题。我需要在Java中生成xml以传递到另一个应用程序。我开始认为使用org.w3c.dom.Document很容易。不幸的是,我需要将XML传递给需要的应用程序需要特殊的字符,例如“需要编码为ASCII(")而不是它们的字符实体(& quot;)。有没有人知道一个简单的解决方案?
P.S。无法更改目标应用程序。
更新: 所以,假设我的应用程序被赋予以下字符串作为输入:
he will "x" this if needed
我的应用需要输出:
<field value="he will "x" this if needed"/>
我正在使用的XML生成器,我猜大多数其他人都输出了这个,但这对我的目标无效:
<field value="he will "x" this if needed"/>
我意识到我的目标可能不太符合XML标准,但这对我没有帮助,因为我无法控制它。这是我的情况,我必须处理它。除了简单地手工转换每个特殊字符之外的任何想法吗?
答案 0 :(得分:2)
我想知道如何将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中,但听起来不像你的场景使用它们,或者目标甚至接受它们)。
我同意Mark您的目标应用程序不是一致的XML处理器。至少它带有文档,明确说明它与XML的区别。我认为该建议书(上面的链接)不同意克里斯托弗的评论,尽管它与OP的问题无关,因为他的目标宣称其不符合建议书。
阿里。
答案 1 :(得分:0)
据我所知,标准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 spec提供一次性操作,并修复字符处理以支持字符above U+FFFF。)