Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Escaping special character when generating an XML in Java

I am trying to develop an XML export feature to give my application users to export their data in an XML format. I have got this feature ready and working until it started failing for some cases. Then I realized that it was because of some special characters that needs to be encoded. for example the data might contain & or ! or % or ' or # etc. etc. and this needs to be escaped properly. I was wondering if there is a generic utility available that can escape all of the special characters as per the XML specification. I couldn't find anything on Google.

Is there something like that already there? or Is there any other way to do it?

Here is the code I am using to generate 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);` 

Sample 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> 
like image 288
Salman A. Kagzi Avatar asked Nov 29 '10 06:11

Salman A. Kagzi


People also ask

How do you escape a character in XML?

XML escape characters There are only five: " &quot; ' &apos; < &lt; > &gt; & &amp; Escaping characters depends on where the special character is used. The examples can be validated at the W3C Markup Validation Service.

How do you escape a special character in Java?

Java Special Characters The solution to avoid this problem, is to use the backslash escape character.


1 Answers

You can use apache common lang library to escape a string.

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

But what you are looking for is a way to convert any string into a valid XML tag name. For ASCII characters, XML tag name must begin with one of _:a-zA-Z and followed by any number of character in _:a-zA-Z0-9.-

I surely believe there is no library to do this for you so you have to implement your own function to convert from any string to match this pattern or alternatively make it into a value of attritbue.

<property name="no more need to be encoded, it should be handled by XML library">0.0</property> 
like image 58
gigadot Avatar answered Oct 04 '22 03:10

gigadot