Java:XML转义特殊字符

Java:XML转义特殊字符,java,xml,parsing,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</nickna

我知道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>

特斯汀
他&apos;llo
世界
星球大战
下面是我的代码,如果有单引号(')和双引号(“),它可以正常工作。 当代码找到&,…时,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() );

           }
         }
import org.xml.sax.SAXException;
导入org.w3c.dom.*;
导入javax.xml.parsers.*;
导入java.io.IOException;
导入com.vordel.trace.trace;
导入org.xml.sax.InputSource;
导入org.apache.commons.lang.StringEscapeUtils;
==========逻辑=====
def输入=
def温度;
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
Document doc=db.parse(新的InputSource(新的StringReader(输入));
doc.getDocumentElement().normalize();
NodeList nList=doc.getElementsByTagName(“学生”);
对于(temp=0;temp
这是不可能的。对于这些角色来说,这不是“可以”转义的问题——它们必须在特定情况下转义。例如,如何区分文本
和标记
?XML设计者提出的解决方案是,对于常规文本,如果某些字符是文本内容,则必须对其进行转义——在本例中,开头的括号
,那么您建议的解决方案是什么?好的,我的理解现在很清楚,我需要替换所有5个特殊字符。java中是否有任何方法可以直接传递文件,它会自动替换特殊字符,而不是逐个迭代元素?谢谢你抽出时间。那怎么可能呢?它还将替换标记中的字符——您的文件将变成
?xml version=“1.0”??类
您需要分别编写标记和内容以避免这种情况problem@user3384231:斯蒂芬是对的。请参见显示选项和参考的重复链接。(#1)目前的选择是在源代码处解决问题。您拥有的不是XML,在一般情况下没有保证自动修复方法。)谢谢。@stephan:是的,这是我的想法,因为它也将替换XML标记,但只是想如果我遗漏了任何其他内容。单独编写标记和内容是一种选择。kjhughes:我看到了另一篇相关的文章,其中提到了预处理清理过滤器检查输入流..这在我的场景中不起作用吗?你知道吗?你有一个看起来有点像XML的大字符串,你试图将它转换成有效的XML。这不是逃跑的方式。通常,XML是按某种程序生成的。在最简单的情况下,它可以像
“+昵称+”
一样原始。转义应该这样做:
“”+escapeText(昵称)+
“”。当你把所有的东西都合并成一根长串的时候,已经太晚了。