2010-10-04 24 views
0

J'ai un élément de schéma XML comme ceci:DOM4J XPath distinguer une chaîne vide ou vide

<xs:element type="xs:string" name="IsActive" minOccurs="0"> </xs:element> 

J'utilise dom4j XPath pour évaluer l'élément.

Il semble impossible de déterminer si l'élément est présent dans le document XML ou si sa valeur est simplement "".

Je veux <IsActive> d'être soit, 1) "" 2) "anyvalue1" 3) "anyvalue"

Je voudrais aussi savoir si <IsActive> est présent.

XPath valuePath; 
Node obj = (Node)valuePath.selectSingleNode(requestElement); 

obj.getText() retourne toujours "", même si <IsActive> n'est pas présent.

valuePath.valueOf(requestElement); // does the same 

Donc ma question est: Comment distinguer les chaînes vides et les chaînes vides?

Répondre

2

Que diriez-vous:

List nodeList = valuePath.selectNodes(requestElement); 
if (nodeList.isEmpty()) ... 

Mise à jour: @Alejandro a souligné qu'il serait utile d'ajouter des explications.

Apparemment, selectSingleNode() ne retourne pas null ou n'offre aucun autre moyen de faire la distinction entre une expression XPath et un contexte qui aboutit à un ensemble de nœuds vide, contrairement à ceux qui fournissent un ou plusieurs nœuds. Cela ne répondra donc pas au besoin actuel.

Toutefois, selectNodes() renvoie un List de nœuds correspondant à l'expression XPath dans le contexte donné. Donc probablement nous pouvons utiliser la méthode List.isEmpty() (ou la méthode size()) pour découvrir si le XPath correspond à zéro nœud, ou non nul.

Si un noeud correspond, pour obtenir le (premier) nœud correspondant nous pouvons utiliser nodeList.get(0):

List nodeList = valuePath.selectNodes(requestElement); 
if (!nodeList.isEmpty()) 
    doSomethingWith(nodeList.get(0)); 

Je n'ai pas testé, mais il devrait vous aider à la portée de votre objectif.

+0

Ceci est juste mais les explications XPath et Dom4j manquantes: OP doit tester l'ensemble de nœuds vide; il semble qu'il n'y ait pas de résultat 'null' pour la méthode' selectNodes' ni de test de nœud vide pour la classe 'Node' dans Dom4j; il existe une méthode 'isEmpty' pour la classe' List'. En outre, le casting 'Node' de la classe n'est pas nécessaire (et peut-être faux, je n'ai pas testé) –

+0

@Alejandro, oups, vous avez raison sur le casting ... c'est faux. Corrigé - merci. – LarsH