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

<html>
<head>
<!-- InstanceBeginEditable name="doctitle" -->
<title>Using Bookmarks to Annotate XML</title>
<!-- InstanceEndEditable --> 
<!--(Meta)==========================================================-->

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


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

<meta name="component" content="">
<!-- In the description metatag, please provide a BRIEF description of the topic contents. -->
<meta name="description" content="">
<!-- In the component metatag, please list keywords that will help a user search for this topic. -->
<meta name="keywords" content="">
<!-- InstanceEndEditable -->

<!--(Links)=========================================================-->
<!-- InstanceBeginEditable name="head" -->
<!-- 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" --> 
<div id=topictitle> 
  <p class=Title>Using Bookmarks to Annotate XML</p>
</div>
<div id=topictext> 
  <p>You can use a cursor to insert bookmarks that annotate XML with markers containing 
    information you design. These bookmarks aren't written into the XML itself, 
    but in a sense "hang" from the location where it was inserted. In this way 
    you can associate arbitrary pieces of information with specific parts of the 
    XML.</p>
  <P>You design your own bookmark classes by extending <span class="langinline"><a href="../reference/org/apache/xmlbeans/XmlCursor.XmlBookmark.html">XmlBookmark</a></span>, 
    a nested class of <span class="langinline"><a href="../reference/org/apache/xmlbeans/XmlCursor.html">XmlCursor</a></span>. 
    You can design your bookmark class to contain information specific to your 
    needs. </P>
  <P>In the following example, <span class="langinline">OrderBookmark</span> is 
    an inner class that extends <span class="langinline">XmlCursor.XmlBookmark</span>. 
    It merely stores a piece of text.</P>
  <PRE>
/* 
 * The OrderBookmark class includes a constructor through which you will 
 * insert your bookmark's content. It also includes get and set methods
 * you can use to retrieve and change the content.
 */
static class OrderBookmark extends XmlCursor.XmlBookmark {
    public OrderBookmark (String text) { TEXT = text; }
    public String TEXT;
    public String getText() { return TEXT; }
    public void setText(String newText) { TEXT = newText; }
}
</PRE>
  <p>You can use instances of this class to store bookmarks at places in your 
    XML. The following excerpt of code creates a cursor and an instance of the 
    <span class="langinline">OrderBookmark</span> class. Then it uses the cursor 
    to insert the bookmark at the cursor's current location.</p>
  <pre>
    XmlCursor orderCursor = xmlDoc.newCursor();
    OrderBookmark thisBookmark = new OrderBookmark("foo");
    orderCursor.setBookmark(thisAnnotation);
</pre>
  <p class=relatedtopics>Related Topics</p>
  <p><a href="conNavigatingXMLwithCursors.html">Navigating XML with Cursors</a></p>
</div>
<!-- InstanceEndEditable -->
<script language="JavaScript">

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