<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">

<!-- Copyright 2004 The Apache Software Foundation

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License. -->
<html>
<head>
<!-- InstanceBeginEditable name="doctitle" -->
<title>Selecting XML with XQuery and XPath</title>
<!-- InstanceEndEditable -->
<!--(Meta)==========================================================-->

<meta http-equiv=Content-Type content="text/html; charset=$CHARSET;">


<!-- InstanceBeginEditable name="metatags" -->

<meta content="your name" name="author">
<meta content="A description of the topic contents." name="description">
<meta content="keywords to help in searches" name="keywords">
<meta content="10/25/02" name="date last modified">
<!-- InstanceEndEditable -->

<!--(Links)=========================================================-->
<!-- InstanceBeginEditable name="head" -->
<link href="../xmlbeans.css" rel="stylesheet" type="text/css">
<!-- InstanceEndEditable -->
<link href="../xmlbeans.css" rel="stylesheet" type="text/css">
<a href="../../../core/index.html" id="index"></a>
<script language="JavaScript" src="../../../core/topicInfo.js"></script>
<script language="JavaScript" src="../../../core/CookieClass.js"></script>
<script language="JavaScript" src="../../../core/displayContent.js"></script>
</head>

<!--(Body)==========================================================-->
<body>
<script language="JavaScript">

</script>
<!-- InstanceBeginEditable name="body" -->
<h1> Selecting XML with XQuery and XPath</h1>
<div id="topictext">
  <p>You can use XQuery and XPath to retrieve specific pieces of XML as you might
    retrieve data from a database. XQuery and XPath provide a syntax for specifying
    which elements and attributes you're interested in. The XMLBeans API provides
    two methods for executing XQuery and XPath expressions, and two differing
    ways to use them. The methods are <span class="langinline">selectPath</span>
    and <span class="langinline">execQuery</span>, and you can call them from
    <a href="../reference/org/apache/xmlbeans/XmlObject.html"><span class="langinline">XmlObject</span></a>
    (or an object inheriting from it) or <a href="../reference/org/apache/xmlbeans/XmlCursor.html"><span class="langinline">XmlCursor</span></a>.
    The results for the methods differ somewhat. </p>
  <h2>Using the selectPath Method</h2>
</div>
<div>
  <p>The <span class="langinline">selectPath</span> method is the most efficient
    way to execute XPath expressions. The <span class="langinline">selectPath</span>
    method is optimized for XPath. When you use XPath with the <span class="langinline">selectPath</span>
    method, the value returned is an array of values from the <em>current document</em>.
    In contrast, when you use <span class="langinline">execQuery</span>, the value
    returned is a <em>new document</em>.</p>
  <h3>Calling from XmlObject</h3>
  <p>When called from <span class="langinline">XmlObject</span> (or a type that
    inherits from it), this method returns an array of objects. If the expression
    is executed against types generated from schema, then the type for the returned
    array is one of the Java types corresponding to the schema. </p>
  <p>For example, imagine you have the following XML containing employee information.
    You've compiled the schema describing this XML and the types generated from
    schema are available to your code.</p>
<pre>
&lt;xq:employees xmlns:xq=&quot;http://openuri.org/selectPath&quot;&gt;
    &lt;xq:employee&gt;
        &lt;xq:name&gt;Fred Jones&lt;/xq:name&gt;
        &lt;xq:address location=&quot;home&quot;&gt;
            &lt;xq:street&gt;900 Aurora Ave.&lt;/xq:street&gt;
            &lt;xq:city&gt;Seattle&lt;/xq:city&gt;
            &lt;xq:state&gt;WA&lt;/xq:state&gt;
            &lt;xq:zip&gt;98115&lt;/xq:zip&gt;
        &lt;/xq:address&gt;
        &lt;xq:address location=&quot;work&quot;&gt;
            &lt;xq:street&gt;2011 152nd Avenue NE&lt;/xq:street&gt;
            &lt;xq:city&gt;Redmond&lt;/xq:city&gt;
            &lt;xq:state&gt;WA&lt;/xq:state&gt;
            &lt;xq:zip&gt;98052&lt;/xq:zip&gt;
        &lt;/xq:address&gt;
        &lt;xq:phone location=&quot;work&quot;&gt;(425)555-5665&lt;/xq:phone&gt;
        &lt;xq:phone location=&quot;home&quot;&gt;(206)555-5555&lt;/xq:phone&gt;
        &lt;xq:phone location=&quot;mobile&quot;&gt;(206)555-4321&lt;/xq:phone&gt;
    &lt;/xq:employee&gt;
&lt;/xq:employees&gt;
</pre>
  If you wanted to find the phone numbers whose area code was 206, you could capture
  the XPath expression in this way:
  <pre>
String queryExpression =
    &quot;declare namespace xq='http://openuri.org/selectPath'&quot; +
    &quot;$this/xq:employees/xq:employee/xq:phone[contains(., '(206)')]&quot;
</pre>
  <p>Notice in the query expression that the variable <span class="langinline">$this</span>
    represents the current context node (the <span class="langinline">XmlObject</span>
    that you are querying from). In this example you are querying from the document
    level <span class="langinline">XmlObject</span>.</p>
  <p>You could then print the results with code such as the following:</p>
  <pre>
/*
 * Retrieve the matching phone elements and assign the results to the corresponding
 * generated type.
 */
PhoneType[] phones = (PhoneType[])empDoc.selectPath(queryExpression);
/*
 * Loop through the results, printing the value of the phone element.
 */
for (int i = 0; i < phones.length; i++)
{
    System.out.println(phones[i].stringValue());
}  </pre>

  <h3>Calling from XmlCursor</h3>
  <p>When called from an <span class="langinline">XmlCursor</span> instance, the
    <span class="langinline">selectPath</span> method retrieves a list of selections,
    or locations in the XML. The selections are remembered by the cursor instance.
    You can use methods such as <span class="langinline">toNextSelection</span>
    to navigate among them.</p>
  <div>
    <p>The <span class="langinline">selectPath</span> method takes an XPath expression.
      If the expression returns any results, each of those results is added as
      a selection to the cursor's list of selections. You can move through these
      selections in the way you might use <span class="langinline">java.util.Iterator</span>
      methods to move through a collection.</p>
    <p> For example, for a path such as <span class="langinline">$this/employees/employee</span>,
      the results would include a selection for each employee element found by
      the expression. Note that the variable <span class="langinline">$this</span>
      is always bound to the current context node, which in this example is the
      document. After calling the <span class="langinline">selectPath</span> method,
      you would use various &quot;selection&quot;-related methods to work with
      the results. These methods include:</p>
  </div>
  <ul>
    <li>
      <div><span class="langinline">getSelectionCount() </span>to retrieve the
        number of selections resulting from the query.</div>
    </li>
    <li>
      <div> <span class="langinline">toNextSelection()</span> to move the cursor
        to the next selection in the list (such as to the one pointing at the
        next employee element found).</div>
    </li>
    <li>
      <div> <span class="langinline">toSelection(int)</span> to move the cursor
        to the selection at the specified index (such as to the third employee
        element in the selection).</div>
    </li>
    <li>
      <div> <span class="langinline">hasNextSelection()</span> to find out if
        there are more selections after the cursor's current position.</div>
    </li>
    <li>
      <div><span class="langinline"> clearSelections()</span> clears the selections
        from the current cursor. This doesn't modify the document (in other words,
        it doesn't delete the selected XML); it merely clears the selection list
        so that the cursor is no longer keeping track of those positions.</div>
    </li>
  </ul>
  <div>
    <p>The following example shows how you might use <span class="langinline">selectPath</span>,
      in combination with the <span class="langinline">push</span> and <span class="langinline">pop</span>
      methods, to maneuver through XML, retrieving specific values. </p>
    <pre>
public void printZipsAndWorkPhones(XmlObject xml)
{
    // Declare the namespace that will be used.
    String xqNamespace =
        &quot;declare namespace xq='http://openuri.org/selectPath'&quot;;

    // Insert a cursor and move it to the first element.
    XmlCursor cursor = xml.newCursor();
    cursor.toFirstChild();
    /*
     * Save the cursor's current location by pushing it
     * onto a stack of saved locations.
     */
    cursor.push();
    // Query for zip elements.
    cursor.selectPath(xqNamespace + &quot;$this//xq:zip&quot;);
    /*
     * Loop through the list of selections, getting the value of
     * each element.
     */
    while (cursor.toNextSelection())
    {
        System.out.println(cursor.getTextValue());
    }
    // Pop the saved location off the stack.
    cursor.pop();
    // Query again from the top, this time for work phone numbers.
    cursor.selectPath(xqNamespace + &quot;$this//xq:phone[@location='work']&quot;);
    /*
     * Move the cursor to the first selection, them print that element's
     * value.
     */
    cursor.toNextSelection();
    System.out.println(cursor.getTextValue());
    // Dispose of the cursor.
    cursor.dispose();
}
</pre>
    <p>Using selections is somewhat like tracking the locations of multiple cursors
      with a single cursor. This becomes especially clear when you remove the
      XML associated with a selection. When you do so the selection itself remains
      at the location where the removed XML was, but now the selection's location
      is immediately before the XML that was after the XML you removed. In other
      words, removing XML created a kind of vacuum that was filled by the XML
      after it, which shifted up into the space &#8212; up into position immediately
      after the selection location. This is exactly the same as if the selection
      had been another cursor.</p>
    <p>Finally, when using selections keep in mind that the list of selections
      is in a sense &quot;live&quot;. The cursor you're working with is keeping
      track of the selections in the list. In other words, be sure to call the
      <span class="langinline">clearSelections</span> method when you're finished
      with the selections, just as you should call the <span class="langinline">XmlCursor.dispose()</span>
      method when you're finished using the cursor.</p>
  </div>
  <h2>Using the execQuery Method</h2>
  <p>Use the <span class="langinline">execQuery</span> method to execute XQuery
    expressions that are more sophisticated than paths. These expressions include
    more sophisticated loops and FLWR (For, Let, Where, and Results) expressions.
  </p>
  <p class="notepara"><strong>Note:</strong> Be sure to see the simpleExpressions
    sample in the SamplesApp application for a sampling of XQuery expressions
    in use.</p>
  <h3>Calling from XmlObject</h3>
  <p>Unlike <span class="langinline">selectPath</span>, calling <span class="langinline">execQuery</span>
    from an <span class="langinline">XmlObject</span> instance will return an
    <span class="langinline">XmlObject</span> array. If the <span class="langinline">XmlObject</span>
    instances resulting from the XQuery match a recognized XMLBeans type (the
    namespace and top level element name match up with an XMLBeans type) then
    the <span class="langinline">XmlObject</span> will be typed; otherwise the
    <span class="langinline">XmlObject</span> will be untyped.</p>
  <h3>Calling from XmlCursor</h3>
</div>

<div>
  <p>Calling <span class="langinline">execQuery</span> from an <span class="langinline">XmlCursor</span>
    instance returns a new <span class="langinline">XmlCursor</span> instance.
    The cursor returned is positioned at the beginning of a new xml document representing
    the query results, and you can use it to move through the results, cursor-style
    (for more information, see <a href="conNavigatingXMLwithCursors.html">Navigating
    XML with Cursors</a>). If the document resulting from the query execution
    represents a recognized XMLBeans type (the namespace and top level element
    name match up with an XMLBeans type) then the document resulting from the
    xquery will have that Java type; otherwise the resulting document will be
    untyped.</p>
  <h2>Related Topics</h2>
</div>
<p><a href="conGettingStartedwithXMLBeans.html">Getting Started with XMLBeans</a></p>
<!-- InstanceEndEditable -->
<script language="JavaScript">

</script>
</body>
</html>
