Java:XML转义特殊字符

时间:2017-11-08 18:09:43

标签: java xml parsing

据我所知,XML有5个必须转义的特殊字符(",',<,>,&) 我正在尝试实施以下内容:

输入xml:

<?xml version = "1.0"?>
<class>
  <student id = "999">
  <firstname>Tes"Ting</firstname>
  <lastname>He'llo</lastname>
  <nickname1>W<or>ld</nickname>
  <nickname2>star&wars</nickname2>
  </student>
</class>

输出XML:

 <?xml version = "1.0"?>
  <class>
  <student id = "999">
  <firstname>Tes&quot;Ting</firstname>
  <lastname>He&apos;llo</lastname>
  <nickname>W&lt;orl&gt;d</nickname>
  <nickname2>star&amp;wars</nickname2>
  </student>
</class>

以下是我的代码,如果有单引号(&#39;)和双引号(&#34;),它可以正常工作。 当代码找到&amp;,&lt;,&gt; ..时,XML解析器会抛出错误。任何人都可以建议如何实施?有什么想法吗?

import org.xml.sax.SAXException;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.IOException;
import com.vordel.trace.Trace;
import org.xml.sax.InputSource;
import org.apache.commons.lang.StringEscapeUtils;

========Logic=====
    def input = <input xml in string>   
    def temp;
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();   
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(new InputSource(new StringReader(input)));
    doc.getDocumentElement().normalize();
    NodeList nList = doc.getElementsByTagName("student");

    for (temp = 0; temp < nList.getLength(); temp++) 
    {
      Node nNode = nList.item(temp);          
      if (nNode.getNodeType() == Node.ELEMENT_NODE) {
         Element eElement = (Element) nNode;
         escapedfirstname=     StringEscapeUtils.escapeXml(eElement.getElementsByTagName("firstname").item(0).getTextContent() );

         escapedlastname= StringEscapeUtils.escapeXml(eElement.getElementsByTagName("lastname").item(0).getTextContent() );

           }
         }

1 个答案:

答案 0 :(得分:1)

这是不可能的。这不是&#34; can&#34;为这些字符进行转义 - 在某些情况下,必须转义。例如,您如何区分文本<or>和标记<or>? XML设计者提出的解决方案是,对于常规文本,如果某些字符是文本内容,则必须对其进行转义 - 在这种情况下,开括号<需要表示为{{1 }}

  • 在常规文字中,必须对&lt;<进行转义,以避免与标记和转义码混淆。
  • 在属性中,必须对与开头报价匹配的报价进行转义,以避免与收盘报价混淆。

所有字符都可以使用数字转义码(例如&

)以XML格式转义