UNPKG

epubjs

Version:

Render ePub documents in the browser, across many devices

193 lines (187 loc) 30 kB
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head><title>DOM</title><link rel="stylesheet" href="core.css" type="text/css"/><meta name="generator" content="DocBook XSL Stylesheets V1.74.0"/></head><body><div class="sect1" title="DOM"><div class="titlepage"><div><div><h1 class="title"><a id="learnjava3-CHP-24-SECT-4"/>DOM</h1></div></div></div><p>In the last section, we used SAX to parse an XML document and build a Java object model representing it. In that case, we created specific Java types for each of our complex elements. If we were planning to use our model extensively in an application, this technique would give us a great deal of flexibility. But often it is sufficient (and much easier) to use a “generic” model that simply represents the content of the XML in a neutral form. The Document Object Model (DOM) is just that. The DOM API parses an XML document into a generic representation consisting of classes with names such as <code class="literal">Element</code> and <code class="literal">Attribute</code> that hold their own values. You could use this to inspect the document structure and pull out the parts you want in a way that is perhaps more convenient than the low-level SAX. The tradeoff is that the entire document is parsed and read into memory—but for most applications, that is fine.</p><p>As we saw in our zoo example, once you have an object model, using the data is a breeze. So a generic DOM would seem like an appealing solution, especially when working mainly with text. One catch in this case is that DOM didn’t evolve first as a Java API and it doesn’t map well to Java. DOM is very complete and provides access to every facet of the original XML document, but it’s so generic (and language-neutral) that it’s cumbersome to use in Java. Later, we’ll also mention a native Java alternative to DOM called JDOM that is more pleasant to use.</p><div class="sect2" title="The DOM API"><div class="titlepage"><div><div><h2 class="title"><a id="learnjava3-CHP-24-SECT-4.1"/>The DOM API</h2></div></div></div><p><a id="idx11190" class="indexterm"/> <a id="I_indexterm24_id830265" class="indexterm"/> <a id="idx11210" class="indexterm"/>The core DOM classes belong to the <code class="literal">org.w3c.dom</code> package. The result of parsing an XML document with DOM is a <a id="I_indexterm24_id830293" class="indexterm"/><code class="literal">Document</code> object from this package (see <a class="xref" href="ch24s05.html#learnjava3-CHP-24-FIG-1" title="Figure 24-1. The parsed DOM">Figure 24-1</a>). The <code class="literal">Document</code> is both a factory and a container for a hierarchical collection of <code class="literal">Node</code> objects, representing the document structure. A node has a parent and may have children, which can be traversed using its <a id="I_indexterm24_id830320" class="indexterm"/><code class="literal">getChildNodes()</code>, <a id="I_indexterm24_id830331" class="indexterm"/><code class="literal">getFirstChild()</code>, or <a id="I_indexterm24_id830342" class="indexterm"/><code class="literal">getLastChild()</code> methods. A node may also have “attributes” associated with it, which consist of a named map of nodes.</p><div class="figure"><a id="learnjava3-CHP-24-FIG-1"/><div class="figure-contents"><div class="mediaobject"><a id="I_24_tt1311"/><img src="httpatomoreillycomsourceoreillyimages1707716.png" alt="The parsed DOM"/></div></div><p class="title">Figure 24-1. The parsed DOM</p></div><p>Subtypes of <code class="literal">Node</code><code class="literal">Element</code>, <code class="literal">Text</code>, and <code class="literal">Attr</code>—represent elements, text, and attributes in XML. Some types of nodes (including these) have a text “value.” For example, the value of a <code class="literal">Text</code> node is the text of the element it represents. The same is true of an <code class="literal">attribute</code>, <code class="literal">cdata</code>, or <code class="literal">comment</code> node. The value of a node can be accessed by the <a id="I_indexterm24_id830420" class="indexterm"/><code class="literal">getNodeValue()</code> and <a id="I_indexterm24_id830431" class="indexterm"/><code class="literal">setNodeValue()</code> methods. We’ll also make use of <code class="literal">Node</code>’s <a id="I_indexterm24_id830447" class="indexterm"/><code class="literal">getTextContent()</code> method, which retrieves the plain-text content of the node and all of its child nodes.</p><p>The <code class="literal">Element</code> node provides “random” access to its child elements through its <a id="I_indexterm24_id830468" class="indexterm"/><code class="literal">getElementsByTagName()</code> method, which returns a <code class="literal">NodeList</code> (a simple collection type). You can also fetch an attribute by name from the <code class="literal">Element</code> using the <a id="I_indexterm24_id830491" class="indexterm"/><code class="literal">getAttribute()</code>method.</p><p>The <code class="literal">javax.xml.parsers</code> package contains a factory for DOM parsers, just as it does for SAX parsers. An instance of <code class="literal">DocumentBuilderFactory</code> can be used to create a <a id="I_indexterm24_id830520" class="indexterm"/><code class="literal">DocumentBuilder</code> object to parse the file and produce a <code class="literal">Document</code> result.<a id="I_indexterm24_id830536" class="indexterm"/><a id="I_indexterm24_id830543" class="indexterm"/></p></div><div class="sect2" title="Test-Driving DOM"><div class="titlepage"><div><div><h2 class="title"><a id="learnjava3-CHP-24-SECT-4.2"/>Test-Driving DOM</h2></div></div></div><p><a id="idx11191" class="indexterm"/> <a id="idx11211" class="indexterm"/>Here is our <code class="literal">TestDOM</code> class:</p><a id="I_24_tt1313"/><pre class="programlisting"> <code class="kn">import</code> <code class="nn">javax.xml.parsers.*</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">org.w3c.dom.*</code><code class="o">;</code> <code class="kd">public</code> <code class="kd">class</code> <code class="nc">TestDOM</code> <code class="o">{</code> <code class="kd">public</code> <code class="kd">static</code> <code class="kt">void</code> <code class="nf">main</code><code class="o">(</code> <code class="n">String</code> <code class="o">[]</code> <code class="n">args</code> <code class="o">)</code> <code class="kd">throws</code> <code class="n">Exception</code> <code class="o">{</code> <code class="n">DocumentBuilderFactory</code> <code class="n">factory</code> <code class="o">=</code> <code class="n">DocumentBuilderFactory</code> <code class="o">.</code><code class="na">newInstance</code><code class="o">();</code> <code class="n">DocumentBuilder</code> <code class="n">parser</code> <code class="o">=</code> <code class="n">factory</code><code class="o">.</code><code class="na">newDocumentBuilder</code><code class="o">();</code> <code class="n">Document</code> <code class="n">document</code> <code class="o">=</code> <code class="n">parser</code><code class="o">.</code><code class="na">parse</code><code class="o">(</code> <code class="s">"zooinventory.xml"</code> <code class="o">);</code> <code class="n">Element</code> <code class="n">inventory</code> <code class="o">=</code> <code class="n">document</code><code class="o">.</code><code class="na">getDocumentElement</code><code class="o">();</code> <code class="n">NodeList</code> <code class="n">animals</code> <code class="o">=</code> <code class="n">inventory</code><code class="o">.</code><code class="na">getElementsByTagName</code><code class="o">(</code><code class="s">"animal"</code><code class="o">);</code> <code class="n">System</code><code class="o">.</code><code class="na">out</code><code class="o">.</code><code class="na">println</code><code class="o">(</code><code class="s">"Animals = "</code><code class="o">);</code> <code class="k">for</code><code class="o">(</code> <code class="kt">int</code> <code class="n">i</code><code class="o">=</code><code class="mi">0</code><code class="o">;</code> <code class="n">i</code><code class="o">&lt;</code><code class="n">animals</code><code class="o">.</code><code class="na">getLength</code><code class="o">();</code> <code class="n">i</code><code class="o">++</code> <code class="o">)</code> <code class="o">{</code> <code class="n">Element</code> <code class="n">item</code> <code class="o">=</code> <code class="o">(</code><code class="n">Element</code><code class="o">)</code><code class="n">animals</code><code class="o">.</code><code class="na">item</code><code class="o">(</code> <code class="n">i</code> <code class="o">);</code> <code class="n">String</code> <code class="n">name</code> <code class="o">=</code> <code class="n">item</code><code class="o">.</code><code class="na">getElementsByTagName</code><code class="o">(</code> <code class="s">"name"</code> <code class="o">).</code><code class="na">item</code><code class="o">(</code> <code class="mi">0</code> <code class="o">)</code> <code class="o">.</code><code class="na">getTextContent</code><code class="o">();</code> <code class="n">String</code> <code class="n">species</code> <code class="o">=</code> <code class="n">item</code><code class="o">.</code><code class="na">getElementsByTagName</code><code class="o">(</code> <code class="s">"species"</code> <code class="o">)</code> <code class="o">.</code><code class="na">item</code><code class="o">(</code> <code class="mi">0</code> <code class="o">).</code><code class="na">getTextContent</code><code class="o">();</code> <code class="n">String</code> <code class="n">animalClass</code> <code class="o">=</code> <code class="n">item</code><code class="o">.</code><code class="na">getAttribute</code><code class="o">(</code> <code class="s">"animalClass"</code> <code class="o">);</code> <code class="n">System</code><code class="o">.</code><code class="na">out</code><code class="o">.</code><code class="na">println</code><code class="o">(</code> <code class="s">" "</code><code class="o">+</code> <code class="n">name</code> <code class="o">+</code><code class="s">" ("</code><code class="o">+</code><code class="n">animalClass</code><code class="o">+</code><code class="s">",</code> <code class="s"> "</code><code class="o">+</code><code class="n">species</code><code class="o">+</code><code class="s">")"</code> <code class="o">);</code> <code class="o">}</code> <code class="n">Element</code> <code class="n">cocoa</code> <code class="o">=</code> <code class="o">(</code><code class="n">Element</code><code class="o">)</code><code class="n">animals</code><code class="o">.</code><code class="na">item</code><code class="o">(</code> <code class="mi">1</code> <code class="o">);</code> <code class="n">Element</code> <code class="n">recipe</code> <code class="o">=</code> <code class="o">(</code><code class="n">Element</code><code class="o">)</code><code class="n">cocoa</code><code class="o">.</code><code class="na">getElementsByTagName</code><code class="o">(</code> <code class="s">"foodRecipe"</code> <code class="o">)</code> <code class="o">.</code><code class="na">item</code><code class="o">(</code> <code class="mi">0</code> <code class="o">);</code> <code class="n">String</code> <code class="n">recipeName</code> <code class="o">=</code> <code class="n">recipe</code><code class="o">.</code><code class="na">getElementsByTagName</code><code class="o">(</code> <code class="s">"name"</code> <code class="o">).</code><code class="na">item</code><code class="o">(</code> <code class="mi">0</code> <code class="o">)</code> <code class="o">.</code><code class="na">getTextContent</code><code class="o">();</code> <code class="n">System</code><code class="o">.</code><code class="na">out</code><code class="o">.</code><code class="na">println</code><code class="o">(</code><code class="s">"Recipe = "</code> <code class="o">+</code> <code class="n">recipeName</code> <code class="o">);</code> <code class="n">NodeList</code> <code class="n">ingredients</code> <code class="o">=</code> <code class="n">recipe</code><code class="o">.</code><code class="na">getElementsByTagName</code><code class="o">(</code><code class="s">"ingredient"</code><code class="o">);</code> <code class="k">for</code><code class="o">(</code><code class="kt">int</code> <code class="n">i</code><code class="o">=</code><code class="mi">0</code><code class="o">;</code> <code class="n">i</code><code class="o">&lt;</code><code class="n">ingredients</code><code class="o">.</code><code class="na">getLength</code><code class="o">();</code> <code class="n">i</code><code class="o">++)</code> <code class="o">{</code> <code class="n">System</code><code class="o">.</code><code class="na">out</code><code class="o">.</code><code class="na">println</code><code class="o">(</code> <code class="s">" "</code> <code class="o">+</code> <code class="n">ingredients</code><code class="o">.</code><code class="na">item</code><code class="o">(</code> <code class="n">i</code> <code class="o">)</code> <code class="o">.</code><code class="na">getTextContent</code><code class="o">()</code> <code class="o">);</code> <code class="o">}</code> <code class="o">}</code> <code class="o">}</code></pre><p><code class="literal">TestDOM</code> creates an instance of a <code class="literal">DocumentBuilder</code> and uses it to parse our <span class="emphasis"><em>zooinventory.xml</em></span> file. We use the <code class="literal">Document</code><a id="I_indexterm24_id830656" class="indexterm"/><code class="literal">getDocumentElement()</code> method to get the root element of the document, from which we will begin our traversal. From there, we ask for all the <code class="literal">animal</code> child nodes. The <a id="I_indexterm24_id830673" class="indexterm"/><code class="literal">getElementbyTagName()</code> method returns a <code class="literal">NodeList</code> object, which we then use to iterate through our creatures. For each animal, we use the <code class="literal">Element</code><code class="literal">getElementsByTagName()</code> method to retrieve the name and species child element information. Each of those queries can potentially return a list of matching elements, but we only allow for one here by taking the first element returned and asking for its text content. We also use the <a id="I_indexterm24_id830703" class="indexterm"/><code class="literal">getAttribute()</code> method to retrieve the <code class="literal">animalClass</code> attribute from the element.</p><p>Next, we use the <code class="literal">getElementsByTagName()</code> to retrieve the element called <code class="literal">foodRecipe</code> from the second animal. We use it to fetch a <code class="literal">NodeList</code> for all of the tags matching <code class="literal">ingredient</code> and print them as before. The output should contain the same information as our SAX-based example. But as you can see, the tradeoff in not having to create our own model classes is that we have to suffer through the use of the generic model and produce code that is considerably harder to read and less flexible.<a id="I_indexterm24_id830748" class="indexterm"/><a id="I_indexterm24_id830755" class="indexterm"/></p></div><div class="sect2" title="Generating XML with DOM"><div class="titlepage"><div><div><h2 class="title"><a id="learnjava3-CHP-24-SECT-4.3"/>Generating XML with DOM</h2></div></div></div><p><a id="I_indexterm24_id830769" class="indexterm"/> <a id="I_indexterm24_id830778" class="indexterm"/>Thus far, we’ve used the SAX and DOM APIs to parse XML. But what about generating XML? Sure, it’s easy to generate trivial XML documents simply by printing the appropriate strings. But if we plan to create a complex document on the fly, we might want some help with all those quotes and closing tags. We may also want to validate our model against an XML DTD or Schema before writing it out. What we can do is to build a DOM representation of our object in memory and then transform it to text. This is also useful if we want to read a document and then make some alterations to it. To do this, we’ll use of the <a id="I_indexterm24_id830800" class="indexterm"/><code class="literal">java.xml.transform</code> package. This package does a lot more than just printing XML. As its name implies, it’s part of a general transformation facility. It includes the XSL/XSLT languages for generating one XML document from another. (We’ll talk about XSL later in this chapter.)</p><p>We won’t discuss the details of constructing a DOM in memory here, but it follows fairly naturally from what you’ve learned about traversing the tree in our previous example. The following example, <code class="literal">PrintDOM</code>, simply parses our <span class="emphasis"><em>zooinventory.xml</em></span> file to a DOM and then prints that DOM back to the screen. The same output code would print any DOM whether read from a file or created in memory using the factory methods on the DOM <code class="literal">Document</code> and <code class="literal">Element</code>, etc.</p><a id="I_24_tt1314"/><pre class="programlisting"> <code class="kn">import</code> <code class="nn">javax.xml.parsers.*</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">org.xml.sax.InputSource</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">org.w3c.dom.*</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">javax.xml.transform.*</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">javax.xml.transform.dom.DOMSource</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">javax.xml.transform.stream.StreamResult</code><code class="o">;</code> <code class="kd">public</code> <code class="kd">class</code> <code class="nc">PrintDOM</code> <code class="o">{</code> <code class="kd">public</code> <code class="kd">static</code> <code class="kt">void</code> <code class="nf">main</code><code class="o">(</code> <code class="n">String</code> <code class="o">[]</code> <code class="n">args</code> <code class="o">)</code> <code class="kd">throws</code> <code class="n">Exception</code> <code class="o">{</code> <code class="n">DocumentBuilder</code> <code class="n">parser</code> <code class="o">=</code> <code class="n">DocumentBuilderFactory</code><code class="o">.</code><code class="na">newInstance</code><code class="o">()</code> <code class="o">.</code><code class="na">newDocumentBuilder</code><code class="o">();</code> <code class="n">Document</code> <code class="n">document</code> <code class="o">=</code> <code class="n">parser</code><code class="o">.</code><code class="na">parse</code><code class="o">(</code> <code class="k">new</code> <code class="nf">InputSource</code><code class="o">(</code><code class="s">"zooinventory.xml"</code><code class="o">)</code> <code class="o">);</code> <code class="n">Transformer</code> <code class="n">transformer</code> <code class="o">=</code> <code class="n">TransformerFactory</code><code class="o">.</code><code class="na">newInstance</code><code class="o">()</code> <code class="o">.</code><code class="na">newTransformer</code><code class="o">();</code> <code class="n">Source</code> <code class="n">source</code> <code class="o">=</code> <code class="k">new</code> <code class="n">DOMSource</code><code class="o">(</code> <code class="n">document</code> <code class="o">);</code> <code class="n">Result</code> <code class="n">output</code> <code class="o">=</code> <code class="k">new</code> <code class="n">StreamResult</code><code class="o">(</code> <code class="n">System</code><code class="o">.</code><code class="na">out</code> <code class="o">);</code> <code class="n">transformer</code><code class="o">.</code><code class="na">transform</code><code class="o">(</code> <code class="n">source</code><code class="o">,</code> <code class="n">output</code> <code class="o">);</code> <code class="o">}</code> <code class="o">}</code></pre><p>Note that the imports are almost as long as the entire program! Here, we are using an instance of a <code class="literal">Transformer</code> object in its simplest capacity to copy from a source to an output. We’ll return to the <code class="literal">Transformer</code> later when we discuss XSL, at which point it will be doing a lot more work for us.</p></div><div class="sect2" title="JDOM"><div class="titlepage"><div><div><h2 class="title"><a id="learnjava3-CHP-24-SECT-4.4"/>JDOM</h2></div></div></div><p><a id="I_indexterm24_id830882" class="indexterm"/> <a id="I_indexterm24_id830891" class="indexterm"/> <a id="I_indexterm24_id830897" class="indexterm"/> <a id="I_indexterm24_id830907" class="indexterm"/> <a id="I_indexterm24_id830914" class="indexterm"/> <a id="I_indexterm24_id830920" class="indexterm"/> <a id="I_indexterm24_id830927" class="indexterm"/>As we promised earlier, we’ll now describe an easier DOM API: JDOM, created by Jason Hunter and Brett McLaughlin, two fellow O’Reilly authors (<a class="ulink" href="http://shop.oreilly.com/product/9780596000400.do"><span class="emphasis"><em>Java Servlet Programming</em></span></a> and <a class="ulink" href="http://shop.oreilly.com/product/9780596101497.do"><span class="emphasis"><em>Java</em></span><span class="emphasis"><em> and XML</em></span></a>, respectively). It is a more natural Java DOM that uses real Java collection types such as <code class="literal">List</code> for its hierarchy and provides marginally more streamlined methods for building documents. You can get the latest JDOM from <a class="ulink" href="http://www.jdom.org/">http://www.jdom.org/</a>. Here’s the JDOM version of our standard “test” program:</p><a id="I_24_tt1315"/><pre class="programlisting"> <code class="kn">import</code> <code class="nn">org.jdom.*</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">org.jdom.input.*</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">org.jdom.output.*</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">java.util.*</code><code class="o">;</code> <code class="kd">public</code> <code class="kd">class</code> <code class="nc">TestJDOM</code> <code class="o">{</code> <code class="kd">public</code> <code class="kd">static</code> <code class="kt">void</code> <code class="nf">main</code><code class="o">(</code> <code class="n">String</code><code class="o">[]</code> <code class="n">args</code> <code class="o">)</code> <code class="kd">throws</code> <code class="n">Exception</code> <code class="o">{</code> <code class="n">Document</code> <code class="n">doc</code> <code class="o">=</code> <code class="k">new</code> <code class="n">SAXBuilder</code><code class="o">().</code><code class="na">build</code><code class="o">(</code><code class="s">"zooinventory.xml"</code><code class="o">);</code> <code class="n">List</code> <code class="n">animals</code> <code class="o">=</code> <code class="n">doc</code><code class="o">.</code><code class="na">getRootElement</code><code class="o">().</code><code class="na">getChildren</code><code class="o">(</code><code class="s">"Animal"</code><code class="o">);</code> <code class="n">System</code><code class="o">.</code><code class="na">out</code><code class="o">.</code><code class="na">println</code><code class="o">(</code><code class="s">"Animals = "</code><code class="o">);</code> <code class="k">for</code><code class="o">(</code> <code class="kt">int</code> <code class="n">i</code><code class="o">=</code><code class="mi">0</code><code class="o">;</code> <code class="n">i</code><code class="o">&lt;</code><code class="n">animals</code><code class="o">.</code><code class="na">size</code><code class="o">();</code> <code class="n">i</code><code class="o">++</code> <code class="o">)</code> <code class="o">{</code> <code class="n">String</code> <code class="n">name</code> <code class="o">=</code> <code class="o">((</code><code class="n">Element</code><code class="o">)</code><code class="n">animals</code><code class="o">.</code><code class="na">get</code><code class="o">(</code><code class="n">i</code><code class="o">)).</code><code class="na">getChildText</code><code class="o">(</code><code class="s">"Name"</code><code class="o">);</code> <code class="n">String</code> <code class="n">species</code> <code class="o">=</code> <code class="o">((</code><code class="n">Element</code><code class="o">)</code><code class="n">animals</code><code class="o">.</code><code class="na">get</code><code class="o">(</code><code class="n">i</code><code class="o">))</code> <code class="o">.</code><code class="na">getChildText</code><code class="o">(</code><code class="s">"Species"</code><code class="o">);</code> <code class="n">System</code><code class="o">.</code><code class="na">out</code><code class="o">.</code><code class="na">println</code><code class="o">(</code> <code class="s">" "</code><code class="o">+</code> <code class="n">name</code> <code class="o">+</code><code class="s">" ("</code><code class="o">+</code><code class="n">species</code><code class="o">+</code><code class="s">")"</code> <code class="o">);</code> <code class="o">}</code> <code class="n">Element</code> <code class="n">foodRecipe</code> <code class="o">=</code> <code class="o">((</code><code class="n">Element</code><code class="o">)</code><code class="n">animals</code><code class="o">.</code><code class="na">get</code><code class="o">(</code><code class="mi">1</code><code class="o">))</code> <code class="o">.</code><code class="na">getChild</code><code class="o">(</code><code class="s">"FoodRecipe"</code><code class="o">);</code> <code class="n">String</code> <code class="n">name</code> <code class="o">=</code> <code class="n">foodRecipe</code><code class="o">.</code><code class="na">getChildText</code><code class="o">(</code><code class="s">"Name"</code><code class="o">);</code> <code class="n">System</code><code class="o">.</code><code class="na">out</code><code class="o">.</code><code class="na">println</code><code class="o">(</code><code class="s">"Recipe = "</code> <code class="o">+</code> <code class="n">name</code> <code class="o">);</code> <code class="n">List</code> <code class="n">ingredients</code> <code class="o">=</code> <code class="n">foodRecipe</code><code class="o">.</code><code class="na">getChildren</code><code class="o">(</code><code class="s">"Ingredient"</code><code class="o">);</code> <code class="k">for</code><code class="o">(</code><code class="kt">int</code> <code class="n">i</code><code class="o">=</code><code class="mi">0</code><code class="o">;</code> <code class="n">i</code><code class="o">&lt;</code><code class="n">ingredients</code><code class="o">.</code><code class="na">size</code><code class="o">();</code> <code class="n">i</code><code class="o">++)</code> <code class="n">System</code><code class="o">.</code><code class="na">out</code><code class="o">.</code><code class="na">println</code><code class="o">(</code> <code class="s">" "</code><code class="o">+((</code><code class="n">Element</code><code class="o">)</code><code class="n">ingredients</code><code class="o">.</code><code class="na">get</code><code class="o">(</code><code class="n">i</code><code class="o">))</code> <code class="o">.</code><code class="na">getText</code><code class="o">()</code> <code class="o">);</code> <code class="o">}</code> <code class="o">}</code></pre><p>The JDOM <a id="I_indexterm24_id831013" class="indexterm"/><code class="literal">Element</code> class has some convenient <a id="I_indexterm24_id831024" class="indexterm"/><code class="literal">getChild()</code> and <a id="I_indexterm24_id831035" class="indexterm"/><code class="literal">getChildren()</code> methods, as well as a <a id="I_indexterm24_id831046" class="indexterm"/><code class="literal">getChildText()</code> method for retrieving node text by element name.</p><p>Now that we’ve covered the basics of SAX and DOM, we’re going to look at a new API that, in a sense, straddles the two. XPath allows us to target only the parts of a document that we want and gives us the option of getting at those components in DOM form.</p></div></div></body></html>