2010-10-07 4 views
9

J'utilise un objet Transform pour enregistrer mon fichier XML, mais il semble que les nœuds de texte vides soient supprimés. Est-il possible de créer (et de conserver) un nœud de texte avec une chaîne vide, c'est-à-dire "".Comment créer un nœud de texte XML avec une valeur de chaîne vide (en Java)

Voici comment je crée le nœud:

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

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

Il est juste que parfois value est une chaîne vide « ». Quand je regarde le XML avec un éditeur de texte je vois

<TYPE /> 

au lieu de

<TYPE></TYPE> 

Après avoir lu ce fichier XML en arrière et parcourir les nœuds du < TYPE élément > ne suffit pas tous les enfants même si j'ai explicitement créé un nœud #text pour cela!

EDIT - Happy Thanksgiving (pour mes compatriotes)

Note importante, je ne travaille pas à partir d'un ensemble connu de balises plutôt le programme sur lequel je travaille utilise la présence d'un nœud de texte pour attribuer un JTextField à l'interface graphique. C'est juste que parfois le champ est vide (pas nul mais ""). Lorsque je stocke ce champ et puis le relire l'interface graphique ne rend plus le JTextField car il n'y a pas de nœud de texte. Donc, je cherche des moyens de créer un document XML qui crée un nœud de texte, même s'il n'y a rien. Si cela ne peut tout simplement pas être fait avec XML, alors je devrai utiliser un attribut pour marquer les tags qui sont éditables (un peu comme Andrey Breslav l'a suggéré) et devrait donc avoir un JTextField assigné.

Je vais essayer la suggestion de Mads Hansen d'un espace insécable.

+1

est équivalent à

Répondre

14

Un nœud texte sans texten'est pas un nœud de texte.

Si vous essayez de contrôler la façon dont l'élément XML est sérialisé, <TYPE/> et <TYPE></TYPE> sont équivalents, et cela ne sera pas important pour un processeur XML s'il a été utilisé. Les deux déclarent un élément TYPE sans aucun text(). La plupart des processeurs sérialiseront un élément vide en tant qu'élément de fermeture automatique.

Si vous voulez vraiment empêcher l'élément d'être sérialisé comme fermeture automatique, vous pourriez obtenir mignon et ajouter un espace zéro largeur que la valeur de nœud de texte:<TYPE>&#x200B;</TYPE> qui ressemblera à: <TYPE></TYPE>.

Il ne s'agit pas d'une chaîne "vide", mais elle peut atteindre ce que vous voulez, et ne remplira pas l'espace si le nœud de texte est sélectionné et utilisé.

+0

Cela fait exactement ce que je veux. J'ai dû changer mon écouteur de focus pour remplacer les chaînes vides par & # x200B; mais c'était un peu trivial. Le seul inconvénient majeur est que si quelqu'un modifiait manuellement le fichier XML et oubliait de placer un espace insécable dans un champ vide, cela gâchait mon interface graphique - mais je peux vivre avec ça :) – BigMac66

1

Je choisirais un attribut de chaîne au lieu du contenu de l'étiquette. Une autre option consiste à utiliser le contenu mais à mettre un attribut dans le cas où le contenu est une chaîne vide.

+0

J'ai essayé ceci et cela fonctionne mais a fait le fichier XML environ 20% plus grand et juste n'a pas regardé juste IMO. – BigMac66

0

Si vous considérez le XML specs, une chaîne vide '' n'est pas vraiment définie parmi l'ensemble des caractères valides . il est donc possible que le constructeur de documents ignore simplement toute occurrence de caractères qui ne sont pas valides. Du point de vue XML, il n'y a pas de différence entre <TYPE/> et <TYPE></TYPE>

4

Il y a deux équivalents et peuvent être utilisés de façon interchangeable. Pour un analyseur XML, cela signifie qu'il n'y a pas de texte. L'analyseur ne fait pas la distinction entre "aucun texte" et "texte de longueur nulle". Par contre, les null et "" de Java sont des concepts totalement différents. Par conséquent, si vous souhaitez mapper des valeurs Java vers XML et vice versa, vous devez gérer cette différence. Et il y a plusieurs alternatives possibles. Par exemple, vous pouvez abandonner les valeurs null pour vos variables String. Ensuite, vous devez vous assurer que toutes vos variables String sont initialisées avec des chaînes vides. Ou vous pouvez dire qu'un élément TYPE sans un enfant de texte (sérialisé comme <TYPE/> ou <TYPE></TYPE>) signifie la chaîne vide en Java et un élément TYPE manquant signifie null. C'est ton choix.

2

Voici le code pour ce que vous cherchez:

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(); 
} 

sortie généré par Il:

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

espère avoir donné bonne chose ... même si je suis d'accord avec ce <Type/> ou <Type></Type> n'a pas de différence par rapport à XML Parser.

Questions connexes