2010-10-24 5 views
4

J'ai une question concernant XML, l'utilisation de DOM par Java et les nœuds vides. Je travaille actuellement sur un projet dans lequel je prends un fichier descripteur XML de machines abstraites (pour l'analyse de texte) et j'analyse une série de chaînes d'entrée avec celles-ci. La construction et l'interprétation de ces machines abstraites sont toutes faites et fonctionnent bien, mais j'ai rencontré une exigence XML plutôt intéressante. Plus précisément, je dois être capable de transformer un nœud InputString vide en une chaîne vide ("") et d'exécuter mes routines d'analyse. Le problème, cependant, se produit lorsque je tente d'extraire ce nœud vide de mon arborescence XML. Cela provoque une exception de pointeur NULL, puis généralement de mauvaises choses commencent à se produire. Voici l'extrait infractionnel de XML (Notez que le premier élément est vide):Gestion de nœuds vides avec Java DOM

<InputStringList> 
     <InputString></InputString> 
     <InputString>000</InputString> 
     <InputString>111</InputString> 
     <InputString>01001</InputString> 
     <InputString>1011011</InputString> 
     <InputString>1011000</InputString> 
     <InputString>01010</InputString> 
     <InputString>1010101110</InputString> 
    </InputStringList> 

J'extrait mes chaînes de la liste à l'aide:

//Get input strings to be validated 
xmlElement = (Element)xmlMachine.getElementsByTagName(XML_INPUT_STRING_LIST).item(0); 
xmlNodeList = xmlElement.getElementsByTagName(XML_INPUT_STRING); 
for (int j = 0; j < xmlNodeList.getLength(); j++) { 

    //Add input string to list 
    if (xmlNodeList.item(j).getFirstChild().getNodeValue() != null) { 
     arrInputStrings.add(xmlNodeList.item(j).getFirstChild().getNodeValue()); 

    } else { 
     arrInputStrings.add(""); 

    } 
} 

Comment dois-je traiter ce cas vide? J'ai trouvé beaucoup d'informations sur la suppression des nœuds de texte vides, mais je dois toujours analyser les nœuds vides comme des chaînes vides. Idéalement, je voudrais éviter d'utiliser un caractère spécial pour désigner une chaîne vide.

Merci d'avance pour votre temps.

Répondre

7
if (xmlNodeList.item(j).getFirstChild().getNodeValue() != null) { 

nodeValue ne devrait pas être nul; il serait firstChild lui-même qui pourrait être nul et doit être vérifiée pour:

Node firstChild= xmlNodeList.item(j).getFirstChild(); 
arrInputStrings.add(firstChild==null? "" : firstChild.getNodeValue()); 

A noter toutefois que cela est encore sensible au contenu étant un seul nœud de texte. Si vous avez un élément avec un autre élément, ou du texte et une section CDATA, il ne suffit pas d'obtenir la valeur du premier enfant pour lire tout le texte.

Ce que vous voulez vraiment, c'est le textContent property de DOM Level 3 Core, qui vous donnera tout le texte à l'intérieur de l'élément, quel qu'en soit le contenu.

arrInputStrings.add(xmlNodeList.item(j).getTextContent()); 

Disponible en Java 1.5 partir.

+0

Je vois. Donc, puisque mon élément n'a techniquement pas de nœud de texte, getFirstChild() explose. Logique. Et getTextContent() a fonctionné comme un charme. Merci pour la réponse rapide. – phobos51594

1

Vous pouvez utiliser une bibliothèque comme jOOX pour simplifier la manipulation DOM standard. Avec jOOX, vous obtenez la liste des chaînes en tant que telles:

List<String> strings = $(xmlMachine).find(XML_INPUT_STRING_LIST) 
            .find(XML_INPUT_STRING) 
            .texts();