web-dev-qa-db-fra.com

Échappement de caractères spéciaux lors de la génération d'un XML en Java

J'essaie de développer une fonctionnalité d'exportation XML pour permettre aux utilisateurs de mon application d'exporter leurs données au format XML. Cette fonctionnalité est prête et fonctionne jusqu’à ce qu’elle échoue dans certains cas. Puis j'ai réalisé que c'était à cause de certains caractères spéciaux qui devaient être encodés. Par exemple, les données peuvent contenir & ou! ou% ou 'ou # etc. etc. et cela doit être correctement échappé ..__Je me demandais s'il existait un utilitaire générique disponible pouvant échapper à tous les caractères spéciaux conformément à la spécification XML. Je n'ai rien trouvé sur Google.

Y a-t-il quelque chose comme ça déjà là? ou y a-t-il un autre moyen de le faire?

Voici le code que j'utilise pour générer du 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);`

Exemple de 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>
28
Salman A. Kagzi

Vous pouvez utiliser Apache common lang library pour échapper à une chaîne.

org.Apache.commons.lang.StringEscapeUtils

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

Mais ce que vous recherchez, c’est un moyen de convertir n’importe quelle chaîne en un nom de balise XML valide . Pour les caractères ASCII, le nom de balise XML doit commencer par l'un des caractères _: a-zA-Z et être suivi d'un nombre quelconque de caractères dans _: a-zA-Z0-9.- 

Je crois sûrement qu’il n’ya pas de bibliothèque pour faire cela pour vous, vous devez donc implémenter votre propre fonction pour convertir une chaîne quelconque pour correspondre à ce modèle ou pour en faire une valeur attritbue.

<property name="no more need to be encoded, it should be handled by XML library">0.0</property>
49
gigadot
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("&", "&amp;");
        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;
}
}
1
Chintan Raghwani

Utilisez le code ci-dessous pour échapper aux caractères d'une chaîne à l'aide de XML.StringEscapeUtils est disponible dans apche commons lang3 jar

StringEscapeUtils.escapeXml11("String to be escaped");
0
Abhishek Jha