Navegación como XSequenceCursor
La interfaz XSequenceCursor le ofrece una visión de los datos de la secuencia.
Acerca de esta tarea
Una secuencia del modelo de datos de XPath y XQuery contiene cero o más valores atómicos, nodos o una mezcla de ambos. Una instancia de la interfaz XSequenceCursor contiene siempre al menos un elemento. Si hay una secuencia vacía, siempre se representa mediante una referencia no válida.
Procedimiento
- En un momento determinado, se coloca una instancia de la interfaz XSequenceCursor que le ofrece acceso a uno de los elementos de una secuencia.
Se coloca inicialmente en el primer elemento de la secuencia; y el usuario lo puede mover hacia adelante y atrás de la secuencia, de elemento en elemento, utilizando los métodos toNext() o toPrevious(), respectivamente.
Si el método toNext() o el método toPrevious() consigue colocar la instancia XSequenceCursor en el siguiente elemento o en el anterior de la secuencia, es decir, si hay un elemento anterior o posterior, el método pasa a ser verdadero (true). Si la instancia XSequenceCursor ya está colocada en el último elemento, en el caso del método toNext(), o en el primer elemento, en el caso del método toPrevious(), el método se convierte en falso (false) y la instancia de la interfaz XSequenceCursor sigue colocada en el mismo elemento que estaba antes de la llamada.
La forma típica de procesar una secuencia que se encuentra en una instancia de la interfaz XSequenceCursor es como se muestra en el ejemplo siguiente: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);
La interfaz XSequenceCursor amplía la interfaz XItemView. Puede utilizar los métodos heredados de la interfaz XItemView para acceder al valor y al tipo de elemento de la secuencia en la que está colocado actualmente XSequenceCursor.
- Si la aplicación necesita hacer referencia a más de un elemento de la secuencia a la vez, puede invocar al método
XSequenceCursor.getSingletonItem() para obtener una instancia de la interfaz XItemView que contenga los datos asociados al elemento actual de la instancia de la interfaz XSequenceCursor.
Si cambia la posición de esa instancia de la interfaz XSequenceCursor a través de una llamada al método toNext() o al método toPrevious(), la instancia de la interfaz XItemView que devuelve una llamada anterior al método XSequenceCursor.getSingletonItem() seguirá haciendo referencia a ese elemento anterior.
Fíjese en el ejemplo siguiente, que cuenta la cantidad de elementos de una secuencia que tienen el mismo tipo y valor que el primer elemento.
La variable firstItem la crea el método XSequenceCursor.getSingletonItem(), por lo que siempre hace referencia al primer elemento de la secuencia. Sin embargo, la variable currentItem contiene una referencia al objeto XSequenceCursor, por lo que siempre estará colocado en el elemento actual de la secuencia.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 alguna vez necesita acceder a los elementos de la secuencia de forma no secuencial, puede que le resulte útil emplear el método
exportAsList de la interfaz XSequenceCursor.
Este método devuelve una instancia de la interfaz java.util.List<XItemView> que contiene los elementos de la secuencia en orden secuencial.


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