Navigation avec XSequenceCursor
L'interface XSequenceCursor vous permet de visualiser les données d'une séquence.
Pourquoi et quand exécuter cette tâche
Dans le modèle de données XPath et XQuery, une séquence contient zéro, une ou plusieurs valeurs atomiques, des noeuds ou une combinaison des deux. Une instance de l'interface XSequenceCursor contient toujours au moins un élément. Si une séquence est vide, elle est toujours représentée par une référence nulle.
Procédure
- A tout moment, une instance de l'interface XSequenceCursor est positionnée de manière à vous donner accès à l'un des éléments d'une séquence.
Elle est initialement positionnée sur le premier élément de la séquence et vous pouvez avancer ou reculer dans la séquence, élément par élément, à l'aide des méthodes
toNext() ou toPrevious() respectivement.
Si la méthode toNext() ou toPrevious() peut positionner l'instance de XSequenceCursor sur l'élément suivant ou précédent dans la séquence, c'est-à-dire s'il existe un élément suivant ou précédent, la méthode renvoie la valeur "true". Si l'instance de XSequenceCursor est déjà positionnée sur le dernier élément de la séquence, dans le cas de la méthode toNext(), ou sur le premier élément de la séquence, dans le cas de la méthode toPrevious(), la méthode renvoie la valeur "false" et l'instance de l'interface XSequenceCursor reste positionnée où elle était avant l'appel.
L'exemple suivant illustre comment traiter habituellement une séquence contenue dans une instance de l'interface XSequenceCursor :XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath("1 to 10"); XSequenceCursor exprResult = expr.execute(); long sum = 0; // If exprResult is null, it means the result sequence is empty if (exprResult != null) { do { // Get each value as a primitive Java long value, and accumulate sum = sum + exprResult.getLongValue(); // Advance exprResult to the next item in the sequence } while (exprResult.toNext()); } System.out.println("Sum is " + sum);
L'interface XSequenceCursor est une extension de l'interface XItemView. Vous pouvez utiliser les méthodes héritées de l'interface XItemView pour accéder aux informations (valeur et type) de l'élément de la séquence sur lequel l'instance de l'interface XSequenceCursor est actuellement positionnée.
- Si votre application a besoin de référencer plusieurs éléments de la séquence en même temps, vous pouvez appeler la méthode XSequenceCursor.getSingletonItem() pour obtenir une instance de l'interface XItemView contenant les données
associées à l'élément actif dans l'instance de l'interface XSequenceCursor.
Si vous changez la position de cette instance de l'interface XSequenceCursor à l'aide d'un appel à la méthode toNext() ou toPrevious(), l'instance de l'interface XItemView qui avait été renvoyée par un précédent appel à la méthode XSequenceCursor.getSingletonItem() sera toujours positionnée sur le même élément que précédemment.
Examinons l'exemple suivant dans lequel le code dénombre les éléments d'une séquence qui ont le même type et la même valeur que le premier élément.
La variable firstItem est créée par la méthode XSequenceCursor.getSingletonItem() et fait donc toujours référence au premier élément de la séquence. La variable currentItem contient une référence à l'objet XSequenceCursor. Elle est donc toujours positionnée sur l'élément actif dans la séquence.XFactory factory = XFactory.newInstance(); // Make a path expression whose result contains ordered part number as first item // and all part numbers used by products in the catalog as the subsequent items XPathExecutable expr = factory.prepareXPath( "string(/order/item/@part-num),doc('catalog.xml')/catalog/product/part/string(@part-num)"); // Read the invoice file XSequenceCursor exprResult = expr.execute(new StreamSource(invoiceFile)); int sameAsFirstCount = 0; // If exprResult is null, it means the result sequence is empty if (exprResult != null) { // Get the first item in the result sequence XItemView firstItem = exprResult.getSingletonItem(); // currentItem always refers to the current item in the result sequence XItemView currentItem = exprResult; do { // Get the type of the first item XTypeConstants.Type itemType = firstItem.getValueType(); // Ensure the type of the first item is the same as the type of // the current item, and compare their values as Java objects if (itemType == currentItem.getValueType() && firstItem.getObjectValue(itemType) .equals(currentItem.getObjectValue(itemType))) { sameAsFirstCount++; } //Advance exprResult (and currentItem) to the next item in the sequence } while (exprResult.toNext()); } System.out.println("Number of items same as the first == "+(sameAsFirstCount-1));
- Si vous avez besoin d'accéder aux élément de la séquence de manière non séquentielle, vous utiliserez plutôt la méthode exportAsList de l'interface
XSequenceCursor.
Cette méthode renvoie une instance de l'interface java.util.List<XItemView> qui présente les éléments de la séquence de manière ordonnée.


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_nav_xseq
Nom du fichier : txml_nav_xseq.html