<!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>Getting Started with XMLBeans</title>
<!-- InstanceEndEditable -->
<!--(Meta)==========================================================-->

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


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

<meta name="author" content="your name">
<meta name="description" content="A description of the topic contents.">
<meta name="keywords" content="keywords to help in searches">
<meta name="date last modified" content="10/25/02">
<!-- 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> Getting Started with XMLBeans</h1>
<div id="topictext">
  <p>XMLBeans provides intuitive ways to handle XML that make it easier for you
    to access and manipulate XML data and documents in Java. </p>
  <p>Characteristics of XMLBeans approach to XML:</p>
</div>
<ul>
  <li>
    <div>It provides a familiar Java object-based view of XML data without losing
      access to the original, native XML structure.</div>
  </li>
  <li>
    <div>The XML's integrity as a document is not lost with XMLBeans. XML-oriented
      APIs commonly take the XML apart in order to bind to its parts. With XMLBeans,
      the entire XML instance document is handled as a whole. The XML data is
      stored in memory as XML. This means that the document order is preserved
      as well as the original element content with whitespace.</div>
  </li>
  <li>
    <div>With types generated from schema, access to XML instances is through
      JavaBean-like accessors, with get and set methods.</div>
  </li>
  <li>
    <div>It is designed with XML schema in mind from the beginning &#8212; XMLBeans
      supports all XML schema definitions.</div>
  </li>
  <li>Access to XML is fast.</li>
</ul>
<div>
  <p>The starting point for XMLBeans is XML schema. A schema (contained in an
    XSD file) is an XML document that defines a set of rules to which other XML
    documents must conform. The XML Schema specification provides a rich data
    model that allows you to express sophisticated structure and constraints on
    your data. For example, an XML schema can enforce control over how data is
    ordered in a document, or constraints on particular values (for example, a
    birth date that must be later than 1900). Unfortunately, the ability to enforce
    rules like this is typically not available in Java without writing custom
    code. XMLBeans honors schema constraints.</p>
  <p class="notepara"><strong>Note:</strong> Where an XML schema defines rules
    for an XML document, an XML <em>instance</em> is an XML document that conforms
    to the schema.</p>
  <p>You compile a schema (XSD) file to generate a set of Java interfaces that
    mirror the schema. With these types, you process XML instance documents that
    conform to the schema. You bind an XML instance document to these types; changes
    made through the Java interface change the underlying XML representation.</p>
  <p>Previous options for handling XML include using XML programming interfaces
    (such as DOM or SAX) or an XML marshalling/binding tool (such as JAXB). Because
    it lacks strong schema-oriented typing, navigation in a DOM-oriented model
    is more tedious and requires an understanding of the complete object model.
    JAXB provides support for the XML schema specification, but handles only a
    subset of it; XMLBeans supports all of it. Also, by storing the data in memory
    as XML, XMLBeans is able to reduce the overhead of marshalling and demarshalling.</p>
  <h1>Accessing XML Using Its Schema</h1>
  <p>To get a glimpse of the kinds of things you can do with XMLBeans, take a
    look at an example using XML for a purchase order. The purchase order XML
    contains data exchanged by two parties, such as two companies. Both parties
    need to be able to rely on a consistent message shape, and a schema specifies
    the common ground. </p>
  <p>Here's what a purchase order XML instance might look like.</p>
  <pre>
&lt;po:purchase-order xmlns:po="http://openuri.org/easypo"&gt;
    &lt;po:customer&gt;
        &lt;po:name&gt;Gladys Kravitz&lt;/po:name&gt;
        &lt;po:address&gt;Anytown, PA&lt;/po:address&gt;
    &lt;/po:customer&gt;
    &lt;po:date&gt;2003-01-07T14:16:00-05:00&lt;/po:date&gt;
    &lt;po:line-item&gt;
        &lt;po:description&gt;Burnham's Celestial Handbook, Vol 1&lt;/po:description&gt;
        &lt;po:per-unit-ounces&gt;5&lt;/po:per-unit-ounces&gt;
        &lt;po:price&gt;21.79&lt;/po:price&gt;
        &lt;po:quantity&gt;2&lt;/po:quantity&gt;
    &lt;/po:line-item&gt;
    &lt;po:line-item&gt;
        &lt;po:description&gt;Burnham's Celestial Handbook, Vol 2&lt;/po:description&gt;
        &lt;po:per-unit-ounces&gt;5&lt;/po:per-unit-ounces&gt;
        &lt;po:price&gt;19.89&lt;/po:price&gt;
        &lt;po:quantity&gt;2&lt;/po:quantity&gt;
    &lt;/po:line-item&gt;
&lt;po:shipper&gt;
        &lt;po:name&gt;ZipShip&lt;/po:name&gt;
        &lt;po:per-ounce-rate&gt;0.74&lt;/po:per-ounce-rate&gt;
    &lt;/po:shipper&gt;
&lt;/po:purchase-order&gt;</pre>
  <p>This XML includes a root element, <span class="langinline">purchase-order</span>,
    that has three kinds of child elements: <span class="langinline">customer</span>,
    <span class="langinline">date</span>, <span class="langinline">line-item</span>,
    and <span class="langinline">shipper</span>. An intuitive, object-based view
    of this XML would provide an object representing the <span class="langinline">purchase-order</span>
    element, and it would have methods for getting the date and for getting subordinate
    objects for <span class="langinline">customer</span>, <span class="langinline">line-item</span>,
    and <span class="langinline">shipper</span> elements. Each of the last three
    would have its own methods for getting the data inside them as well.</p>
  <h2>Looking at the Schema</h2>
  <p>The following XML is the the schema for the preceding purchase order XML.
    It defines the XML's &quot;shape&quot; &#8212; what its elements are, what
    order they appear in, which are children of which, and so on.</p>
</div>
<div>
  <pre>
&lt;xs:schema targetNamespace="http://openuri.org/easypo"
    xmlns:po="http://openuri.org/easypo"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"&gt;

    &lt;xs:element name="purchase-order"&gt;
        &lt;xs:complexType&gt;
            &lt;xs:sequence&gt;
                &lt;xs:element name="customer" type="po:customer"/&gt;
                &lt;xs:element name="date" type="xs:dateTime"/&gt;
                &lt;xs:element name="line-item" type="po:line-item" minOccurs="0" maxOccurs="unbounded"/&gt;
                &lt;xs:element name="shipper" type="po:shipper" minOccurs="0"/&gt;
            &lt;/xs:sequence&gt;
        &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;
    &lt;xs:complexType name="customer"&gt;
        &lt;xs:sequence&gt;
            &lt;xs:element name="name" type="xs:string"/&gt;
            &lt;xs:element name="address" type="xs:string"/&gt;
        &lt;/xs:sequence&gt;
    &lt;/xs:complexType&gt;
    &lt;xs:complexType name="line-item"&gt;
        &lt;xs:sequence&gt;
            &lt;xs:element name="description" type="xs:string"/&gt;
            &lt;xs:element name="per-unit-ounces" type="xs:decimal"/&gt;
            &lt;xs:element name="price" type="xs:double"/&gt;
            &lt;xs:element name="quantity" type="xs:int"/&gt;
        &lt;/xs:sequence&gt;
    &lt;/xs:complexType&gt;
    &lt;xs:complexType name="shipper"&gt;
        &lt;xs:sequence&gt;
            &lt;xs:element name="name" type="xs:string"/&gt;
            &lt;xs:element name="per-ounce-rate" type="xs:decimal"/&gt;
        &lt;/xs:sequence&gt;
    &lt;/xs:complexType&gt;
&lt;/xs:schema&gt;</pre>
  <div>
    <p>This schema describes the purchase order XML instance by defining the following:</p>
  </div>
  <ul>
    <li>
      <div>Definitions for three complex types &#8212; customer, line-item, and
        shipper. These are the types used for the children of the purchase-order
        element. In schema, a complex type is one that defines an element that
        may have child elements and attributes. The sequence element nested in
        the complex type lists its child elements.</div>
      <p>These are also <em>global</em> types. They are global because they are
        at the top level of the schema (in other words, just beneath the <span class="langinline">schema</span>
        root element). This means that they may be referenced from anywhere else
        in the schema.</p>
    </li>
  </ul>
</div>
<div>
  <ul>
    <li>Use of simple types within the complex types. The name, address, and description
      elements (among others) are typed as simple types. As it happens, these
      are also <em>built-in</em> types. A built-in type (here, one with the &quot;xs&quot;
      prefix) is part of the schema specification. (The specification defines
      46 built-in types.)</li>
    <li>A global element called purchase-order. This element definition includes
      a nested complex type definition that specifies the child elements for a
      purchase-order element. Notice that the complex type includes references
      to the other complex types defined in this schema.</li>
  </ul>
  <div></div>
  <p>In other words, the schema defines types for the child elements and describes
    their position as subordinate to the root element, <span class="langinline">purchase-order</span>.</p>
  <p>When you use the XMLBean compiler with an XSD file such as this one, you
    generate a JAR file containing the interfaces generated from the schema.</p>
  <h2>Writing Java Code That Uses the Interfaces</h2>
  <p>With the XMLBeans interfaces in your application, you can write code that
    uses the new types to handle XML based on the schema. Here's an example that
    extracts information about each of the ordered items in the purchase order
    XML, counts the items, and calculates a total of their prices. In particular,
    look at the use of types generated from the schema and imported as part of
    the <span class="langinline">org.openuri.easypo</span> package. </p>
  <p>The <span class="langinline">printItems</span> method receives a <span class="langinline">File</span>
    object containing the purchase order XML file.</p>
  <pre>
package docs.xmlbeans;

import java.io.File;
import org.apache.xmlbeans.*;
import org.openuri.easypo.PurchaseOrderDocument;
import org.openuri.easypo.PurchaseOrder;
import org.openuri.easypo.LineItem;

public class POHandler
{
    public static void printItems(File po) throws Exception
    {
        /*
         * All XMLBeans schema types provide a nested Factory class you can
         * use to bind XML to the type, or to create new instances of the type.
         * Note that a "Document" type such as this one is an XMLBeans
         * construct for representing a global element. It provides a way
         * for you to get and set the contents of the entire element.
         *
         * Also, note that the parse method will only succeed if the
         * XML you're parsing appears to conform to the schema.
         */
        PurchaseOrderDocument poDoc =
            PurchaseOrderDocument.Factory.parse(po);

        /*
         * The PurchaseOrder type represents the purchase-order element's
         * complex type.
         */
        PurchaseOrder po = poDoc.getPurchaseOrder();

        /*
         * When an element may occur more than once as a child element,
         * the schema compiler will generate methods that refer to an
         * array of that element. The line-item element is defined with
         * a maxOccurs attribute value of "unbounded", meaning that
         * it may occur as many times in an instance document as needed.
         * So there are methods such as getLineItemArray and setLineItemArray.
         */
        LineItem[] lineitems = po.getLineItemArray();
        System.out.println("Purchase order has " + lineitems.length + " line items.");

        double totalAmount = 0.0;
        int numberOfItems = 0;

        /*
         * Loop through the line-item elements, using generated accessors to
         * get values for child elements such a description, quantity, and
         * price.
         */
        for (int j = 0; j < lineitems.length; j++)
        {
            System.out.println(" Line item: " + j);
            System.out.println(
                "   Description: " + lineitems[j].getDescription());
            System.out.println("   Quantity: " + lineitems[j].getQuantity());
            System.out.println("   Price: " + lineitems[j].getPrice());
            numberOfItems += lineitems[j].getQuantity();
            totalAmount += lineitems[j].getPrice() * lineitems[j].getQuantity();
        }
        System.out.println("Total items: " + numberOfItems);
        System.out.println("Total amount: " + totalAmount);
    }
}
</pre>
  <p>Notice that types generated from the schema reflect what's in the XML:</p>
</div>
<ul>
  <li>
    <div>A <span class="langinline">PurchaseOrderDocument</span> represents the
      global root element.</div>
  </li>
  <li>
    <div>A <span class="langinline">getPurchaseOrder</span> method returns a <span class="langinline">PurchaseOrderDocument.PurchaseOrder</span>
      type that contains child elements, including <span class="langinline">line-item</span>.
      A <span class="langinline">getLineItemArray</span> method returns a <span class="langinline">LineItem</span>
      array containing the <span class="langinline">line-item</span> elements.</div>
  </li>
  <li>Other methods, such as <span class="langinline">getQuantity</span>, <span class="langinline">getPrice</span>,
    and so on, follow naturally from what the schema describes, returning corresponding
    children of the <span class="langinline">line-item</span> element.</li>
  <li>The name of the package containing these types is derived from the schema's
    target namespace.</li>
</ul>
<div>
  <p>Capitalization and punctuation for generated type names follow Java convention.
    Also, while this example parses the XML from a file, other <span class="langinline">parse</span>
    methods support a Java <span class="langinline">InputStream</span> object,
    a <span class="langinline">Reader</span> object, and so on.</p>
  <p>The preceding Java code prints the following to the console:</p>
</div>
<div>
  <pre>
Purchase order has 3 line items.
 Line item 0
   Description: Burnham's Celestial Handbook, Vol 1
   Quantity: 2
   Price: 21.79
 Line item 1
   Description: Burnham's Celestial Handbook, Vol 2
   Quantity: 2
   Price: 19.89
Total items: 4
Total amount: 41.68</pre>
  <h2>Creating New XML Instances from Schema</h2>
  <p>As you've seen XMLBeans provides a &quot;factory&quot; class you can use
    to create new instances. The following example creates a new <span class="langinline">purchase-order</span>
    element and adds a <span class="langinline">customer</span> child element.
    It then inserts <span class="langinline">name</span> and <span class="langinline">address</span>
    child elements, creating the elements and setting their values with a single
    call to their <span class="langinline">set</span> methods.</p>
  <pre>
public PurchaseOrderDocument createPO()
{
&nbsp;&nbsp;&nbsp;&nbsp;PurchaseOrderDocument newPODoc = PurchaseOrderDocument.Factory.newInstance();
&nbsp;&nbsp;&nbsp;&nbsp;PurchaseOrder newPO = newPODoc.addNewPurchaseOrder();
&nbsp;&nbsp;&nbsp;&nbsp;Customer newCustomer = newPO.addNewCustomer();
&nbsp;&nbsp;&nbsp;&nbsp;newCustomer.setName(&quot;Doris Kravitz&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;newCustomer.setAddress(&quot;Bellflower, CA&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;return newPODoc;
}
</pre>
  <p>The following is the XML that results. Note that XMLBeans assigns the correct
    namespace based on the schema, using an &quot;ns1&quot; (or, &quot;namespace
    1&quot;) prefix. For practical purposes, the prefix itself doesn't really
    matter &#8212; it's the namespace URI (http://openuri.org/easypo) that defines
    the namespace. The prefix is merely a marker that represents it.</p>
  <pre>&lt;ns1:purchase-order xmlns:ns1=&quot;http://openuri.org/easypo&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;ns1:customer&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ns1:name&gt;Doris Kravitz&lt;/ns1:name&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ns1:address&gt;Bellflower, CA&lt;/ns1:address&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ns1:customer&gt;
&lt;/ns1:purchase-order&gt;
</pre>
  <p>Note that all types (including those generated from schema) inherit from
    <span class="langinline">XmlObject</span>, and so provide a <span class="langinline">Factory</span>
    class. For an overview of the type system in which <span class="langinline">XmlObject</span>
    fits, see <a href="conXMLBeansSupportBuiltInSchemaTypes.html">XMLBeans Support
    for Built-In Schema Types</a>. For reference information, see <a href="../reference/org/apache/xmlbeans/XmlObject.html">XmlObject
    Interface</a>.</p>
  <h1>XMLBeans Hierarchy</h1>
  <p>The generated types you saw used in the preceding example are actually part
    of a hierarchy of XMLBeans types. This hierarchy is one of the ways in which
    XMLBeans presents an intuitive view of schema. At the top of the hierarchy
    is <span class="langinline">XmlObject</span>, the base interface for XMLBeans
    types. Beneath this level, there are two main type categories: generated types
    that represent user-derived schema types, and included types that represent
    built-in schema types.</p>
  This topic has already introduced generated types. For more information, see
  <a href="conJavaTypesGeneratedFromUserDerived.html">Java Types Generated from
  User-Derived Schema Types.</a>
  <h2>Built-In Type Support</h2>
  <p>In addition to types generated from a given schema, XMLBeans provides 46
    Java types that mirror the 46 built-in types defined by the XML schema specification.
    Where schema defines <span class="langinline">xs:string</span>, <span class="langinline">xs:decimal</span>,
    and <span class="langinline">xs:int</span>, for example, XMLBeans provides
    <span class="langinline"><a href="../reference/org/apache/xmlbeans/XmlString.html">XmlString</a></span>,
    <span class="langinline"><a href="../reference/org/apache/xmlbeans/XmlDecimal.html">XmlDecimal</a></span>,
    and <span class="langinline"><a href="../reference/org/apache/xmlbeans/XmlInt.html">XmlInt</a></span>.
    Each of these also inherits from <span class="langinline">XmlObject</span>,
    which corresponds to the built-in schema type <span class="langinline">xs:anyType</span>.</p>
  <p>XMLBeans provides a way for you to handle XML data as these built-in types.
    Where your schema includes an element whose type is, for example, <span class="langinline">xs:int</span>,
    XMLBeans will provide a generated method designed to return an <span class="langinline">XmlInt</span>.
    In addition, as you saw in the preceding example, for most types there will
    also be a method that returns a natural Java type such as <span class="langinline">int</span>.
    The following two lines of code return the <span class="langinline">quantity</span>
    element's value, but return it as different types.</p>
  <pre>
// Methods that return simple types begin with an "x".
XmlInt xmlQuantity = lineitems[j].xgetQuantity();
// Methods that return a natural Java type are unadorned.
int javaQuantity = lineitems[j].getQuantity();
</pre>
  <p>In a sense both get methods navigate to the <span class="langinline">quantity</span>
    element; the <span class="langinline">getQuantity</span> method goes a step
    further and converts the elements value to the most appropriate natural Java
    type before returning it. (XMLBeans also provides a means for validating the
    XML as you work with it.)</p>
  <p>If you know a bit about XML schema, XMLBeans types should seem fairly intuitive.
    If you don't, you'll learn a lot by experimenting with XMLBeans using your
    own schemas and XML instances based on them. </p>
  <p>For more information on the methods of types generated from schema, see <a href="conMethodsForGeneratedJavaTypes.html">Methods
    for Types Generated From Schema</a>. For more about the how XMLBeans represents
    built-in schema types, see <a href="conXMLBeansSupportBuiltInSchemaTypes.html">XMLBeans
    Support for Built-In Schema Types</a>.</p>
  <h1>Using XQuery Expressions</h1>
  <p>With XMLBeans you can use XQuery to query XML for specific pieces of data.
    XQuery is sometimes referred to as &quot;SQL for XML&quot; because it provides
    a mechanism to access data directly from XML documents, much as SQL provides
    a mechanism for accessing data in traditional databases.</p>
  <p>XQuery borrows some of its syntax from XPath, a syntax for specifying nested
    data in XML. The following example returns all of the <span class="langinline">line-item</span>
    elements whose <span class="langinline">price</span> child elements have values
    less than or equal to 20.00:</p>
  <pre>
PurchaseOrderDocument doc = PurchaseOrderDocument.Factory.parse(po);

/*
 * The XQuery expression is the following two strings combined. They're
 * declared separately here for convenience. The first string declares
 * the namespace prefix that's used in the query expression; the second
 * declares the expression itself.
 */
String nsText = "declare namespace po = 'http://openuri.org/easypo'";
String pathText = "$this/po:purchase-order/po:line-item[po:price <= 20.00]";
String queryText = nsText + pathText;

XmlCursor itemCursor = doc.newCursor().execQuery(queryText);
System.out.println(itemCursor.xmlText());
</pre>
  <p>This code creates a new cursor at the start of the document. From there,
    it uses the <span class="langinline">XmlCursor</span> interface's <span class="langinline">execQuery</span>
    method to execute the query expression. In this example, the method's parameter
    is an XQuery expression that simply says, &quot;From my current location,
    navigate through the <span class="langinline">purchase-order</span> element
    and retrieve those <span class="langinline">line-item</span> elements whose
    value is less than or equal to 20.00.&quot; The <span class="langinline">$this</span>
    variable means &quot;the current position.&quot;</p>
  <p>For more information about XQuery, see <a href="http://www.w3.org/TR/xquery/" target="_blank">XQuery
    1.0: An XML Query Language</a> at the W3C web site.</p>
  <h2>Using XML Cursors</h2>
  <p>In the preceding example you may have noticed the <span class="langinline"><a href="../reference/org/apache/xmlbeans/XmlCursor.html">XmlCursor</a></span>
    interface. In addition to providing a way to execute XQuery expression, an
    XML cursors offers a fine-grained model for manipulating data. The XML cursor
    API, analogous to the DOM's object API, is simply a way to point at a particular
    piece of data. So, just like a cursor helps navigate through a word processing
    document, the XML cursor defines a location in XML where you can perform actions
    on the selected XML.</p>
  <p>Cursors are ideal for moving through an XML document when there's no schema
    available. Once you've got the cursor at the location you're interested in,
    you can perform a variety of operations with it. For example, you can set
    and get values, insert and remove fragments of XML, copy fragments of XML
    to other parts of the document, and make other fine-grained changes to the
    XML document.</p>
  <p>The following example uses an XML cursor to navigate to the <span class="langinline">customer</span>
    element's <span class="langinline">name</span> child element.</p>
  <pre>
PurchaseOrderDocument doc =
    PurchaseOrderDocument.Factory.parse(po);

XmlCursor cursor = doc.newCursor();
cursor.toFirstContentToken();
cursor.toFirstChildElement();
cursor.toFirstChildElement();
System.out.println(cursor.getText());

cursor.dispose();
</pre>
  <p>What's happening here? As with the earlier example, the code loads the XML
    from a <span class="langinline">File</span> object. After loading the document,
    the code creates a cursor at its beginning. Moving the cursor a few times
    takes it to the nested <span class="langinline">name </span> element. Once
    there, the getText method retrieves the element's value.</p>
  <p>This is just an introduction to XML cursors. For more information about using
    cursors, see <a href="conNavigatingXMLwithCursors.html">Navigating XML with
    Cursors</a>.</p>
  <h2>Where to Go Next</h2>
</div>
<ul>
  <li>
    <div>XMLBeans provides intuitive ways to handle XML, particularly if you're
      starting with schema. If you're accessing XML that's based on a schema,
      you'll probably find it most efficient to access the XML through generated
      types specific to the schema. To do this, you begin by compiling the schema
      to generate interfaces. For more information on using XMLBeans types generated
      by compiling schema, see <a href="conJavaTypesGeneratedFromUserDerived.html">Java
      Types Generated From User-Derived Schema Types</a> and <a href="conMethodsForGeneratedJavaTypes.html">Methods
      for Types Generated From Schema</a>.</div>
  </li>
  <li>
    <div>You might be interested in reading more about the type system on which
      XMLBeans is based, particularly if you're using types generated from schema.
      XMLBeans provides a hierarchical system of types that mirror what you find
      in the XML schema specification itself. If you're working with schema, you
      might find it helps to understand how these types work. For more information,
      see <a href="conXMLBeansSupportBuiltInSchemaTypes.html">XMLBeans Support
      for Built-In Schema Types</a> and <a href="conIntroToTheSchemaTypeSystem.html">Introduction
      to Schema Type Signatures</a>.</div>
  </li>
  <li>
    <div>XMLBeans provides access to XML through XQuery, which borrows path syntax
      from XPath. With XQuery, you can specify specific fragments of XML data
      with or without schema. To learn more about using XQuery and XPath in XMLBeans,
      see <a href="conSelectingXMLwithXQueryPathXPath.html">Selecting XML with
      XQuery and XPath</a>.</div>
  </li>
  <li>You can use the <span class="langinline">XmlCursor</span> interface for
    fine-grained navigation and manipulation of XML. For more information, see
    <a href="conNavigatingXMLwithCursors.html">Navigating XML with Cursors</a>.</li>
</ul>
<div>
  <p class="notepara"><strong>Note:</strong> The xbean.jar file that contains
    the XMLBeans library is fully functional as a standalone library.</p>
  <h1>Related Topics</h1>
  <p><a href="../../samples/navXMLBeansSamples.html">XMLBeans Samples</a></p>
</div>
<!-- InstanceEndEditable -->
<script language="JavaScript">

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