Navigation mit XSequenceCursor
Mit dem Interface XSequenceCursor erhalten Sie eine Sicht Ihrer Sequenzdaten.
Informationen zu diesem Vorgang
Im XPath- und XQuery-Datenmodell enthält eine Sequenz null oder mehr atomare Werte und/oder Knoten. Eine Instanz des Interface XSequenceCursor enthält immer mindestens ein Element. Wenn eine Sequenz leer ist, wird sie immer in Form einer Nullreferenz dargestellt.
Vorgehensweise
- Eine Instanz des Interface XSequenceCursor ist immer so positioniert, dass Sie auf eines der Elemente in einer Sequenz
zugreifen können.
Zunächst befindet sie sich im ersten Element der Sequenz und kann von dort aus mit der Methode
toNext() in der Sequenz jeweils um ein Element vorwärts und mit der Methode toPrevious() jeweils um ein Element rückwärts bewegt werden.
Wenn die Methode toNext() oder toPrevious() in der Lage ist, die XSequenceCursor-Instanz zum nächsten oder vorherigen Element der Sequenz zu bewegen, bedeutet dies, dass es ein nächstes oder vorheriges Element gibt. Die Methode gibt in dem Fall "true" zurück. Befindet sich die XSequenceCursor-Instanz beim Aufruf der Methode toNext() bereits im letzten Element oder beim Aufruf der Methode toPrevious() bereits im ersten Element, gibt die Methode "false" zurück. Eine Instanz des Interface XSequenceCursor verbleibt in dem Fall in dem Element, in dem sie sich vor dem Aufruf befunden hat.
Eine Sequenz, die in einer Instanz des Interface XSequenceCursor enthalten ist, wird normalerweise wie im folgenden Beispiel verarbeitet:XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath("1 to 10"); XSequenceCursor exprResult = expr.execute(); long sum = 0; // Wenn exprResult gleich null ist, ist die Ergebnissequenz leer. if (exprResult != null) { do { // Einzelwerte als primitive Java-Long-Werte abrufen und ansammeln sum = sum + exprResult.getLongValue(); // exprResult vorwärts zum nächsten Element der Sequenz bewegen } while (exprResult.toNext()); } System.out.println("Sum is " + sum);
Das Interface XSequenceCursor erweitert das Interface XItemView. Mit vom Interface XItemView geerbten Methoden können Sie auf den Wert und den Typ des Elements in der Sequenz zugreifen, in dem der XSequenceCursor zurzeit positioniert ist.
- Wenn Ihre Anwendung mehrere Elemente der Sequenz auf einmal referenzieren muss, können Sie die Methode
XSequenceCursor.getSingletonItem()
aufrufen, um die Instanz des Interface XItemView abzurufen, die die dem aktuellen Element in der Instanz des
Interface XSequenceCursor zugeordneten Daten enthält.
Falls Sie die Position dieser Instanz des Interface XSequenceCursor mit einem Aufruf der Methode toNext() oder toPrevious() ändern, referenziert die Instanz des Interface XItemView, die von einem vorherigen Aufruf der Methode XSequenceCursor.getSingletonItem() zurückgegeben wurde, weiterhin das vorherige Element.
Schauen Sie sich im folgenden Beispiel an, wie in einer Sequenz die Elemente gezählt werden, die denselben Typ und denselben Wert wie das erste Element haben.
Die Variable firstItem wird von der Methode XSequenceCursor.getSingletonItem() erstellt, so dass sie immer auf das erste Element in der Sequenz verweist. Die Variable currentItem enthält eine Referenz auf das Objekt XSequenceCursor, sodass der Cursor immer im aktuellen Element der Sequenz positioniert ist.XFactory factory = XFactory.newInstance(); // Pfadausdruck erstellen, dessen Ergebnis die bestellte Teilenummer als erstes Element // und alle Teilenummern von Produkten im Katalog als Folgeelemente enthält XPathExecutable expr = factory.prepareXPath( "string(/order/item/@part-num),doc('catalog.xml')/catalog/product/part/string(@part-num)"); // Rechnungsdatei lesen XSequenceCursor exprResult = expr.execute(new StreamSource(invoiceFile)); int sameAsFirstCount = 0; // Wenn exprResult gleich null ist, ist die Ergebnissequenz leer. if (exprResult != null) { // Erstes Element der Ergebnissequenz abrufen XItemView firstItem = exprResult.getSingletonItem(); // currentItem referenziert immer das aktuelle Element in der Ergebnissequenz. XItemView currentItem = exprResult; do { // Typ des ersten Elements abrufen XTypeConstants.Type itemType = firstItem.getValueType(); // Sicherstellen, dass der Typ des ersten Elements mit dem des aktuellen // Elements übereinstimmt, und Typwerte als Java-Objekte vergleichen if (itemType == currentItem.getValueType() && firstItem.getObjectValue(itemType) .equals(currentItem.getObjectValue(itemType))) { sameAsFirstCount++; } // exprResult (und currentItem) vorwärts zum nächsten Element der Sequenz bewegen } while (exprResult.toNext()); } System.out.println("Number of items same as the first == "+(sameAsFirstCount-1));
- Sollten Sie je ohne Berücksichtigung der Reihenfolge auf Elemente in der Sequenz zugreifen müssen, könnte
die Methode exportAsList für das Interface
XSequenceCursor hilfreich sein.
Diese Methode gibt eine Instanz des Interface java.util.List<XItemView> zurück, die die Elemente Ihrer Sequenz in der Reihenfolge der Sequenz enthält.


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