我正在用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);
并保存到文件中。
现在我的问题是字符串“测试”应该是 & QUOT;试验&安培; “ ,但它会以 &安培; QUOT;试验&安培;安培; QUOT;
似乎&单独转义。任何人都可以告诉我我的代码有什么问题吗?
答案 0 :(得分:3)
你的字符串被转义两次。
"test"
- > "test"
("
转发为"
)"test"
- > "test"
(&
转发为&
)我被欺骗相信这一行
node.setTextContent(temp);
已经逃脱了,但事实并非如此......
Node.setTextContent(String) API doc:
...类似地,在设置时,也不执行解析,输入字符串被视为纯文本内容。
然而,LSSerializer确实:
在文档的字符数据(标记之外)中,任何不能直接表示的字符都将替换为字符引用。 '<'的出现和'&'由预定义的实体<和&amp ;.其他预定义实体(>,'和“)可能不会被使用,除非需要(例如在']中使用>]和>;)。
因此,无论是哪种情况,都不需要使用StringEscapeUtils.escapeXml(val);
进行两次转义,您可以省略该行,从而产生:
String val="\""+val+"\"";
node.setTextContent(val);
甚至更简单:
node.setTextContent("\""+val+"\"");
或者对我来说可能更好(我不喜欢连接字符串):
node.setText(String.format("\"%s\"", val));
然而,我不明白为什么要转义"
,因为(在文本节点中)不会破坏XML格式....