0

我正在用 Java 编写一个解析器,我正在用 XML dom 编写一个字符串。

这是我的代码

String val="\""+val+"\"";
String temp=StringEscapeUtils.escapeXml(val);
node.setTextContent(temp);

然后我正在使用 LSSerializer

DOMImplementationLS domImplementation = (DOMImplementationLS)doc.getImplementation();
LSSerializer lsSerializer = domImplementation.createLSSerializer();
String tempString=lsSerializer.writeToString(doc);

并保存到文件中。

现在我的问题是字符串“测试”应该是“测试”。但它以“测试”的形式出现

似乎 & 是单独转义的。谁能告诉我我的代码有什么问题?

4

1 回答 1

3

你的字符串被转义了两次。

  1. "test"-> "test""转义为"
  2. "test"-> "test"&转义为&

我被骗相信这条线

node.setTextContent(temp);

已经进行了转义,但事实并非如此......

Node.setTextContent(String) API 文档

...同样,在设置时,也不进行解析,输入字符串被视为纯文本内容

但是,LSSerializer会:

在文档的字符数据中(标记之外),任何不能直接表示的字符都将替换为字符引用。'<' 和 '&' 的出现被预定义的实体 < 和 & 替换。可能不会使用其他预定义的实体(>、' 和 "),除非需要(例如,在诸如 ']]>' 的情况下使用 >)。

因此,无论哪种情况,都无需使用 进行两次转义StringEscapeUtils.escapeXml(val);,您可以省略该行,从而导致:

String val="\""+val+"\"";
node.setTextContent(val);

或者更简单:

node.setTextContent("\""+val+"\"");

或者对我来说可能更好一点(我不喜欢连接字符串):

node.setText(String.format("\"%s\"", val));

但是,我不明白您为什么要"转义,因为(在文本节点中)不会破坏 XML 格式....

于 2013-03-25T12:14:11.380 回答