在Java中生成XML时转义特殊字符

我正在尝试开发XML导出function,以便我的应用程序用户以XML格式导出他们的数据。 我已经准备好这个function,直到它开始失败了一些情况。 然后我意识到这是因为需要编码的一些特殊字符。 例如,数据可能包含&或! 或%或’或#等等,这需要妥善转义。 我想知道是否有可用的通用实用程序可以根据XML规范转义所有特殊字符。 我在谷歌上找不到任何东西。

那里有类似的东西吗? 或者还有其他办法吗?

这是我用来生成XML的代码

Document xmldoc = new DocumentImpl(); Element root = xmldoc.createElement("Report"); Element name= xmldoc.createElement((exportData.getChartName() == null) ? "Report" : exportData.getChartName()); if (exportData.getExportDataList().size() > 0 && exportData.getExportDataList().get(0) instanceof Vector) { // First row is the HEADER, ie name Vector name = exportData.getExportDataList().get(0); for (int i = 1; i value = exportData.getExportDataList().get(i); Element sub_root = xmldoc.createElement("Data"); //I had to remove a for loop from here. StackOverflow description field would not take that. :( // Insert header row Element node = xmldoc.createElementNS(null, replaceUnrecognizedChars(name.get(j))); Node node_value = xmldoc.createTextNode(value.get(j)); node.appendChild(node_value); sub_root.appendChild(node); chartName.appendChild(sub_root); } } } root.appendChild(name); // Prepare the DOM document for writing Source source = new DOMSource(root); // Prepare the output file Result result = new StreamResult(file); // Write the DOM document to the file Transformer xformer = TransformerFactory.newInstance().newTransformer(); xformer.transform(source, result);` 

示例XML:

  2010-08-31 00:00:00.0 0.0 1860.0  

您可以使用apache常用lang库来转义字符串。

 org.apache.commons.lang.StringEscapeUtils String escapedXml = StringEscapeUtils.escapeXml("the data might contain & or ! or % or ' or # etc"); 

但是,您正在寻找的是将任何字符串转换为有效的XML标记名称的方法 。 对于ASCII字符,XML标记名称必须以_:a-zA-Z之一开头,后跟_中的任意数量的字符:a-zA-Z0-9.-

我肯定相信没有库可以为你做这个,所以你必须实现自己的函数来转换任何字符串以匹配这个模式,或者将它变成attritbue的值。

 0.0 
 public class RssParser { int length; URL url; URLConnection urlConn; NodeList nodeList; Document doc; Node node; Element firstEle; NodeList titleList; Element ele; NodeList txtEleList; String retVal, urlStrToParse, rootNodeName; public RssParser(String urlStrToParse, String rootNodeName){ this.urlStrToParse = urlStrToParse; this.rootNodeName = rootNodeName; url=null; urlConn=null; nodeList=null; doc=null; node=null; firstEle=null; titleList=null; ele=null; txtEleList=null; retVal=null; doc = null; try { url = new URL(this.urlStrToParse); // dis is path of url which v'll parse urlConn = url.openConnection(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); String s = isToString(urlConn.getInputStream()); s = s.replace("&", "&"); StringBuilder sb = new StringBuilder (""); sb.append("\n"+s); System.out.println("STR: \n"+sb.toString()); s = sb.toString(); doc = db.parse(urlConn.getInputStream()); nodeList = doc.getElementsByTagName(this.rootNodeName); // dis is d first node which // contains other inner element-nodes length =nodeList.getLength(); firstEle=doc.getDocumentElement(); } catch (ParserConfigurationException pce) { System.out.println("Could not Parse XML: " + pce.getMessage()); } catch (SAXException se) { System.out.println("Could not Parse XML: " + se.getMessage()); } catch (IOException ioe) { System.out.println("Invalid XML: " + ioe.getMessage()); } catch(Exception e){ System.out.println("Error: "+e.toString()); } } public String isToString(InputStream in) throws IOException { StringBuffer out = new StringBuffer(); byte[] b = new byte[512]; for (int i; (i = in.read(b)) != -1;) { out.append(new String(b, 0, i)); } return out.toString(); } public String getVal(int i, String param){ node =nodeList.item(i); if(node.getNodeType() == Node.ELEMENT_NODE) { System.out.println("Param: "+param); titleList = firstEle.getElementsByTagName(param); if(firstEle.hasAttribute("id")) System.out.println("hasAttrib----------------"); else System.out.println("Has NOTNOT NOT"); System.out.println("titleList: "+titleList.toString()); ele = (Element)titleList.item(i); System.out.println("ele: "+ele); txtEleList = ele.getChildNodes(); retVal=(((Node)txtEleList.item(0)).getNodeValue()).toString(); if (retVal == null) return null; System.out.println("retVal: "+retVal); } return retVal; } }