我正在尝试开发 XML 导出功能,以便我的应用程序用户能够以 XML 格式导出数据。我已经准备好此功能并一直工作,直到它在某些情况下开始失败。后来我意识到是因为一些特殊字符需要编码。例如数据可能包含 & 或 !或 % 或 ' 或 # 等等,这需要正确转义。 我想知道是否有一个通用实用程序可以根据 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, i.e 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:
<Data>
<TimeStamp>2010-08-31 00:00:00.0</TimeStamp>
<[Name that needs to be encoded]>0.0</[Name that needs to be encoded]>
<Group_Average>1860.0</Group_Average>
</Data>
您可以使用apache通用文本库来转义字符串。
org.apache.commons.text.StringEscapeUtils
# For XML 1.0
String escapedXml = StringEscapeUtils.escapeXml10("the data might contain & or ! or % or ' or # etc");
# For XML 1.1
String escapedXml = StringEscapeUtils.escapeXml11("the data might contain & or ! or % or ' or # etc");
但是您正在寻找的是一种将任何字符串转换为有效的 XML 标记名称的方法。对于 ASCII 字符,XML 标记名称必须以 _:a-zA-Z 之一开头,后跟 _:a-zA-Z0-9 中的任意数量的字符。-
我相信没有库可以为您执行此操作,因此您必须实现自己的函数来从任何字符串进行转换以匹配此模式,或者将其转换为 attritbue 的值。
<property name="no more need to be encoded, it should be handled by XML library">0.0</property>
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
("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
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;
}
}
使用下面的代码使用 XML 对字符串中的字符进行转义。StringEscapeUtils 在 apche commons lang3 jar 中可用
StringEscapeUtils.escapeXml11("String to be escaped");