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

Viewed 49600

I am using a Transform object to save my XML file but it seems to drop empty text nodes. Is there any way to create (and keep) a text node with an empty string i.e. "".

Here is how I create the node:

Element type = doc.createElement("TYPE");

type.appendChild(doc.createTextNode(value));

It is just that sometimes value is an empty string "". When I look at the XML with a text editor I see

<TYPE />

instead of

<TYPE></TYPE>

After I read this XML file back in and traverse the nodes the <TYPE> element simply doesn't have any children even though I explicitly created one #text node for it!

EDIT - Happy Thanksgiving (for my fellow Canadians)

Important note, I am not working from a known set of tags, rather the program I am working on uses the presence of a text node to assign a JTextField to the GUI. It is just that sometimes the field is left empty (not null but ""). When I store that field and then read it back the GUI doesn't render the JTextField anymore because there is no text node. So I am looking at ways to create an XML document that creates a text node even if there is nothing in it. If that simply can't be done with XML then I will have to use an attribute to mark tags that are editable (somewhat like Andrey Breslav suggested) and so should have a JTextField assigned.

I will try Mads Hansen's suggestion of a non-breaking space.

7 Answers

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've had a similar issue where when the XML was parsed back in, <Element /> was treated as null when what I needed was <Element></Element> so it would be parsed in as an empty string. I ended up working around this by adding an empty comment node to it so it ended up looking like this <Element><!----></Element>.

Sorry if this doesn't directly answer the question but this is top answer on google so thought someone might find this useful.

You should anotate your field with

@XmlElement(nillable=true)

Just set it to null and you will get:

<TYPE xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>

It indicates that an element is empty.

Otherwise, if you want just open and close tags, just set its value to "" (empty String). And you will get:

<TYPE></TYPE>
Related