逃避双重报价无法正常工作

时间:2013-03-25 12:12:16

标签: java unicode character-encoding xml-parsing escaping

我正在用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;

似乎&单独转义。任何人都可以告诉我我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:3)

你的字符串被转义两次。

  1. "test" - > "test""转发为"
  2. "test" - > "test"&转发为&
  3. 我被欺骗相信这一行

    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格式....