How to create an XML text node with an empty string value (in Java)

Here is the code for what you are looking for:

try{
    DocumentBuilderFactory docFactory=DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder=docFactory.newDocumentBuilder();

    //root Elements -- Response
    Document doc=docBuilder.newDocument();
    doc.setXmlStandalone(true);
    Element response=doc.createElement("Data");
    doc.appendChild(response);

    // Child Element -- Play
    Element hangup=doc.createElement("Type");
    response.appendChild(hangup);

    //Writer the content into xml file
    TransformerFactory transformerFactory=TransformerFactory.newInstance();
    Transformer transformer=transformerFactory.newTransformer();
    transformer.setOutputProperty(OutputKeys.INDENT,"yes");

    DOMSource source=new DOMSource(doc);
    StreamResult result=new StreamResult(sayOut);
    //StreamResult result=new StreamResult(System.out);

    transformer.transform(source,result);
    logger.info("===========XML GENERATION DON FOR HANGUP============");

}catch(ParserConfigurationException pce){
    logger.error(" ==============2======== ERROR IN PRASERCONFIGURATION ===================================");
    pce.printStackTrace();
}

Output Generated By It:

<?xml version="1.0" encoding="UTF-8"?>
<Data>
<Type/>
</Data>

Hope I have given right thing... although I agree with that <Type/> or <Type></Type> has no difference with respect to XML Parser.


I'd go for a string attribute instead of tag contents. Another option is to use contents but put an attribute in case the contents is empty string.


A text node without text is not a text node.

If you are trying to control how the XML element is serialized, <TYPE/> and <TYPE></TYPE> are equivalent, and it will not matter to an XML processor if either was used. Both are declaring a TYPE element without any text(). Most processors will serialize an empty element as a self-closing element.

If you really want to prevent the element from being serialized as self-closing, you could get cute and add a zero-width space as the text node value: <TYPE>&#x200B;</TYPE> which will look like: <TYPE></TYPE>.

It isn't technically an "empty" string, but might achieve what you want, and will not pad with space if the text node is selected and used.


From an XML point of view, there is no difference between <TYPE/> and <TYPE></TYPE>. There are both equivalent and can be used interchangeably. For an XML parser it means, that there is no text. The parser doesn't distinguish between "no text" and a "zero length text".

In contrast Java's null and "" are totally different concepts.

So if you want to map from Java values to XML and vice versa you have to handle that mismatch. And there are several possible alternatives. For example you can abandon null values for your String variables. Then you have to ensure, that all your String variables are initialized with empty strings. Or you can say a TYPE element without a text child (serialized as <TYPE/> or <TYPE></TYPE>) means the empty string in Java and a missing TYPE element stands for null. It's your choice.

Tags:

Java

Xml