<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FXML%2FXPath</id>
		<title>Java/XML/XPath - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FXML%2FXPath"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/XML/XPath&amp;action=history"/>
		<updated>2026-04-21T13:40:40Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/XML/XPath&amp;diff=8795&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/XML/XPath&amp;diff=8795&amp;oldid=prev"/>
				<updated>2010-06-01T07:17:01Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 07:17, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/XML/XPath&amp;diff=8794&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/XML/XPath&amp;diff=8794&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:47Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Create an XML document and search by XPath ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
import javax.xml.parsers.DocumentBuilderFactory;&lt;br /&gt;
import javax.xml.xpath.XPath;&lt;br /&gt;
import javax.xml.xpath.XPathConstants;&lt;br /&gt;
import javax.xml.xpath.XPathFactory;&lt;br /&gt;
import org.w3c.dom.Document;&lt;br /&gt;
import org.w3c.dom.Element;&lt;br /&gt;
public class MainClass {&lt;br /&gt;
  public static void main(String[] args) throws Exception {&lt;br /&gt;
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();&lt;br /&gt;
    Document retval = dbf.newDocumentBuilder().newDocument();&lt;br /&gt;
    Element parent = retval.createElement(&amp;quot;parent&amp;quot;);&lt;br /&gt;
    retval.appendChild(parent);&lt;br /&gt;
    Element child1 = retval.createElement(&amp;quot;child&amp;quot;);&lt;br /&gt;
    child1.setTextContent(&amp;quot;child.text&amp;quot;);&lt;br /&gt;
    parent.appendChild(child1);&lt;br /&gt;
    Element child2 = retval.createElement(&amp;quot;child&amp;quot;);&lt;br /&gt;
    child2.setTextContent(&amp;quot;child.text.2&amp;quot;);&lt;br /&gt;
    parent.appendChild(child2);&lt;br /&gt;
    XPathFactory factory = XPathFactory.newInstance();&lt;br /&gt;
    XPath xPath = factory.newXPath();&lt;br /&gt;
    System.out.println(xPath.evaluate(&amp;quot;//child/text()&amp;quot;, retval, XPathConstants.NODE).getClass());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Deep print of node list ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
import java.io.PrintStream;&lt;br /&gt;
import javax.xml.transform.Transformer;&lt;br /&gt;
import javax.xml.transform.dom.DOMSource;&lt;br /&gt;
import javax.xml.transform.stream.StreamResult;&lt;br /&gt;
import org.w3c.dom.Document;&lt;br /&gt;
import org.w3c.dom.NamedNodeMap;&lt;br /&gt;
import org.w3c.dom.Node;&lt;br /&gt;
import org.w3c.dom.NodeList;&lt;br /&gt;
import com.sun.org.apache.xpath.internal.XPathAPI;&lt;br /&gt;
public class MainClass {&lt;br /&gt;
  public static void print(Node node, OutputStream os) {&lt;br /&gt;
    PrintStream ps = new PrintStream(os);&lt;br /&gt;
    switch (node.getNodeType()) {&lt;br /&gt;
    case Node.ELEMENT_NODE:&lt;br /&gt;
      ps.print(&amp;quot;&amp;lt;&amp;quot; + node.getNodeName());&lt;br /&gt;
      NamedNodeMap map = node.getAttributes();&lt;br /&gt;
      for (int i = 0; i &amp;lt; map.getLength(); i++) {&lt;br /&gt;
        ps.print(&amp;quot; &amp;quot; + map.item(i).getNodeName() + &amp;quot;=\&amp;quot;&amp;quot;&lt;br /&gt;
            + map.item(i).getNodeValue() + &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      ps.println(&amp;quot;&amp;gt;&amp;quot;);&lt;br /&gt;
      return;&lt;br /&gt;
    case Node.ATTRIBUTE_NODE:&lt;br /&gt;
      ps.println(node.getNodeName() + &amp;quot;=\&amp;quot;&amp;quot; + node.getNodeValue() + &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
      return;&lt;br /&gt;
    case Node.TEXT_NODE:&lt;br /&gt;
      ps.println(node.getNodeValue());&lt;br /&gt;
      return;&lt;br /&gt;
    case Node.CDATA_SECTION_NODE:&lt;br /&gt;
      ps.println(node.getNodeValue());&lt;br /&gt;
      return;&lt;br /&gt;
    case Node.PROCESSING_INSTRUCTION_NODE:&lt;br /&gt;
      ps.println(node.getNodeValue());&lt;br /&gt;
      return;&lt;br /&gt;
    case Node.DOCUMENT_NODE:&lt;br /&gt;
    case Node.DOCUMENT_FRAGMENT_NODE:&lt;br /&gt;
      ps.println(node.getNodeName() + &amp;quot;=&amp;quot; + node.getNodeValue());&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  static void evalXPath(Document doc, Transformer serializer, String absolute,&lt;br /&gt;
      String relative) throws Exception {&lt;br /&gt;
    NodeList list = XPathAPI.selectNodeList(doc, absolute, doc);&lt;br /&gt;
    Node node = null;&lt;br /&gt;
    // &lt;br /&gt;
    for (int i = 0; (node = list.item(i)) != null; i++) {&lt;br /&gt;
      NodeList innerList = XPathAPI.selectNodeList(node, relative, doc);&lt;br /&gt;
      Node innerNode = null;&lt;br /&gt;
      for (int j = 0; (innerNode = innerList.item(j)) != null; j++) {&lt;br /&gt;
        serializer.transform(new DOMSource(node), new StreamResult(System.out));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Get the String data associated with the XPath selection supplied ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 Milyn - Copyright (C) 2006&lt;br /&gt;
 This library is free software; you can redistribute it and/or&lt;br /&gt;
 modify it under the terms of the GNU Lesser General Public&lt;br /&gt;
 License (version 2.1) as published by the Free Software &lt;br /&gt;
 Foundation.&lt;br /&gt;
 This library is distributed in the hope that it will be useful,&lt;br /&gt;
 but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  &lt;br /&gt;
 &lt;br /&gt;
 See the GNU Lesser General Public License for more details:    &lt;br /&gt;
 http://www.gnu.org/licenses/lgpl.txt&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
import org.w3c.dom.Attr;&lt;br /&gt;
import org.w3c.dom.DOMException;&lt;br /&gt;
import org.w3c.dom.Document;&lt;br /&gt;
import org.w3c.dom.Node;&lt;br /&gt;
import org.w3c.dom.NodeList;&lt;br /&gt;
import org.xml.sax.EntityResolver;&lt;br /&gt;
import org.xml.sax.ErrorHandler;&lt;br /&gt;
import org.xml.sax.InputSource;&lt;br /&gt;
import org.xml.sax.SAXException;&lt;br /&gt;
import org.xml.sax.SAXParseException;&lt;br /&gt;
&lt;br /&gt;
import javax.xml.XMLConstants;&lt;br /&gt;
import javax.xml.parsers.DocumentBuilder;&lt;br /&gt;
import javax.xml.parsers.DocumentBuilderFactory;&lt;br /&gt;
import javax.xml.parsers.FactoryConfigurationError;&lt;br /&gt;
import javax.xml.parsers.ParserConfigurationException;&lt;br /&gt;
import javax.xml.transform.OutputKeys;&lt;br /&gt;
import javax.xml.transform.Transformer;&lt;br /&gt;
import javax.xml.transform.TransformerFactory;&lt;br /&gt;
import javax.xml.transform.dom.DOMSource;&lt;br /&gt;
import javax.xml.transform.stream.StreamResult;&lt;br /&gt;
import javax.xml.transform.stream.StreamSource;&lt;br /&gt;
import javax.xml.validation.Schema;&lt;br /&gt;
import javax.xml.validation.SchemaFactory;&lt;br /&gt;
import javax.xml.xpath.XPath;&lt;br /&gt;
import javax.xml.xpath.XPathConstants;&lt;br /&gt;
import javax.xml.xpath.XPathExpressionException;&lt;br /&gt;
import javax.xml.xpath.XPathFactory;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.Reader;&lt;br /&gt;
import java.io.StringReader;&lt;br /&gt;
import java.io.StringWriter;&lt;br /&gt;
import java.io.Writer;&lt;br /&gt;
/**&lt;br /&gt;
 * XMl utility methods.&lt;br /&gt;
 *&lt;br /&gt;
 * @author Tom Fennelly&lt;br /&gt;
 */&lt;br /&gt;
public class XmlUtil {&lt;br /&gt;
    /**&lt;br /&gt;
     * Document validation types.&lt;br /&gt;
     */&lt;br /&gt;
    public static enum VALIDATION_TYPE {&lt;br /&gt;
        /**&lt;br /&gt;
         * No validation.&lt;br /&gt;
         */&lt;br /&gt;
        NONE,&lt;br /&gt;
        /**&lt;br /&gt;
         * DTD based validation.&lt;br /&gt;
         */&lt;br /&gt;
        DTD,&lt;br /&gt;
        /**&lt;br /&gt;
         * XSD based validation.&lt;br /&gt;
         */&lt;br /&gt;
        XSD,&lt;br /&gt;
    }&lt;br /&gt;
    private static String ELEMENT_NAME_FUNC = &amp;quot;/name()&amp;quot;;&lt;br /&gt;
    private static XPathFactory xPathFactory = XPathFactory.newInstance();&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the String data associated with the XPath selection supplied.&lt;br /&gt;
     *&lt;br /&gt;
     * @param node  The node to be searched.&lt;br /&gt;
     * @param xpath The XPath String to be used in the selection.&lt;br /&gt;
     * @return The string data located at the specified location in the&lt;br /&gt;
     *         document, or an empty string for an empty resultset query.&lt;br /&gt;
     */&lt;br /&gt;
    public static String getString(Node node, String xpath) {&lt;br /&gt;
        NodeList nodeList = getNodeList(node, xpath);&lt;br /&gt;
        if (nodeList == null || nodeList.getLength() == 0) {&lt;br /&gt;
            return &amp;quot;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (xpath.endsWith(ELEMENT_NAME_FUNC)) {&lt;br /&gt;
            if (nodeList.getLength() &amp;gt; 0) {&lt;br /&gt;
                return nodeList.item(0).getNodeName();&lt;br /&gt;
            } else {&lt;br /&gt;
                return &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            return serialize(nodeList);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Serialise the supplied W3C DOM subtree.&lt;br /&gt;
     * &amp;lt;p/&amp;gt;&lt;br /&gt;
     * The output is unformatted.&lt;br /&gt;
     *&lt;br /&gt;
     * @param nodeList The DOM subtree as a NodeList.&lt;br /&gt;
     * @return The subtree in serailised form.&lt;br /&gt;
     * @throws DOMException Unable to serialise the DOM.&lt;br /&gt;
     */&lt;br /&gt;
    public static String serialize(NodeList nodeList) throws DOMException {&lt;br /&gt;
        return serialize(nodeList, false);&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Serialise the supplied W3C DOM subtree.&lt;br /&gt;
     *&lt;br /&gt;
     * @param node The DOM node to be serialized.&lt;br /&gt;
     * @param format Format the output.&lt;br /&gt;
     * @return The subtree in serailised form.&lt;br /&gt;
     * @throws DOMException Unable to serialise the DOM.&lt;br /&gt;
     */&lt;br /&gt;
    public static String serialize(final Node node, boolean format) throws DOMException {&lt;br /&gt;
        StringWriter writer = new StringWriter();&lt;br /&gt;
        serialize(node, format, writer);&lt;br /&gt;
        return writer.toString();&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Serialise the supplied W3C DOM subtree.&lt;br /&gt;
     *&lt;br /&gt;
     * @param node The DOM node to be serialized.&lt;br /&gt;
     * @param format Format the output.&lt;br /&gt;
     * @param writer The target writer for serialization.&lt;br /&gt;
     * @throws DOMException Unable to serialise the DOM.&lt;br /&gt;
     */&lt;br /&gt;
    public static void serialize(final Node node, boolean format, Writer writer) throws DOMException {&lt;br /&gt;
        if(node.getNodeType() == Node.DOCUMENT_NODE) {&lt;br /&gt;
            serialize(node.getChildNodes(), format, writer);&lt;br /&gt;
        } else {&lt;br /&gt;
            serialize(new NodeList() {&lt;br /&gt;
                public Node item(int index) {&lt;br /&gt;
                    return node;&lt;br /&gt;
                }&lt;br /&gt;
                public int getLength() {&lt;br /&gt;
                    return 1;&lt;br /&gt;
                }&lt;br /&gt;
            }, format, writer);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Serialise the supplied W3C DOM subtree.&lt;br /&gt;
     *&lt;br /&gt;
     * @param nodeList The DOM subtree as a NodeList.&lt;br /&gt;
     * @param format Format the output.&lt;br /&gt;
     * @return The subtree in serailised form.&lt;br /&gt;
     * @throws DOMException Unable to serialise the DOM.&lt;br /&gt;
     */&lt;br /&gt;
    public static String serialize(NodeList nodeList, boolean format) throws DOMException {&lt;br /&gt;
        StringWriter writer = new StringWriter();&lt;br /&gt;
        serialize(nodeList, format, writer);&lt;br /&gt;
        return writer.toString();&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Serialise the supplied W3C DOM subtree.&lt;br /&gt;
     *&lt;br /&gt;
     * @param nodeList The DOM subtree as a NodeList.&lt;br /&gt;
     * @param format Format the output.&lt;br /&gt;
     * @param writer The target writer for serialization.&lt;br /&gt;
     * @throws DOMException Unable to serialise the DOM.&lt;br /&gt;
     */&lt;br /&gt;
    public static void serialize(NodeList nodeList, boolean format, Writer writer) throws DOMException {&lt;br /&gt;
        if (nodeList == null) {&lt;br /&gt;
            throw new IllegalArgumentException(&lt;br /&gt;
                    &amp;quot;null &amp;quot;subtree&amp;quot; NodeIterator arg in method call.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        try {&lt;br /&gt;
            TransformerFactory factory = TransformerFactory.newInstance();&lt;br /&gt;
            Transformer transformer;&lt;br /&gt;
            if(format) {&lt;br /&gt;
                try {&lt;br /&gt;
                    factory.setAttribute(&amp;quot;indent-number&amp;quot;, new Integer(4));&lt;br /&gt;
                } catch(Exception e) {&lt;br /&gt;
                    // Ignore... Xalan may throw on this!!&lt;br /&gt;
                    // We handle Xalan indentation below (yeuckkk) ...&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            transformer = factory.newTransformer();&lt;br /&gt;
            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, &amp;quot;yes&amp;quot;);&lt;br /&gt;
            if(format) {&lt;br /&gt;
                transformer.setOutputProperty(OutputKeys.INDENT, &amp;quot;yes&amp;quot;);&lt;br /&gt;
                transformer.setOutputProperty(&amp;quot;{http://xml.apache.org/xalan}indent-amount&amp;quot;, &amp;quot;4&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            int listLength = nodeList.getLength();&lt;br /&gt;
            // Iterate through the Node List.&lt;br /&gt;
            for (int i = 0; i &amp;lt; listLength; i++) {&lt;br /&gt;
                Node node = nodeList.item(i);&lt;br /&gt;
                if (isTextNode(node)) {&lt;br /&gt;
                    writer.write(node.getNodeValue());&lt;br /&gt;
                } else if (node.getNodeType() == Node.ATTRIBUTE_NODE) {&lt;br /&gt;
                    writer.write(((Attr) node).getValue());&lt;br /&gt;
                } else if (node.getNodeType() == Node.ELEMENT_NODE) {&lt;br /&gt;
                    transformer.transform(new DOMSource(node), new StreamResult(writer));&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } catch (Exception e) {&lt;br /&gt;
            DOMException domExcep = new DOMException(&lt;br /&gt;
                    DOMException.INVALID_ACCESS_ERR,&lt;br /&gt;
                    &amp;quot;Unable to serailise DOM subtree.&amp;quot;);&lt;br /&gt;
            domExcep.initCause(e);&lt;br /&gt;
            throw domExcep;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Is the supplied W3C DOM Node a text node.&lt;br /&gt;
     *&lt;br /&gt;
     * @param node The node to be tested.&lt;br /&gt;
     * @return True if the node is a text node, otherwise false.&lt;br /&gt;
     */&lt;br /&gt;
    public static boolean isTextNode(Node node) {&lt;br /&gt;
        short nodeType;&lt;br /&gt;
        if (node == null) {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        nodeType = node.getNodeType();&lt;br /&gt;
        return nodeType == Node.CDATA_SECTION_NODE&lt;br /&gt;
                || nodeType == Node.TEXT_NODE;&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Get the W3C NodeList instance associated with the XPath selection&lt;br /&gt;
     * supplied.&lt;br /&gt;
     *&lt;br /&gt;
     * @param node  The document node to be searched.&lt;br /&gt;
     * @param xpath The XPath String to be used in the selection.&lt;br /&gt;
     * @return The W3C NodeList instance at the specified location in the&lt;br /&gt;
     *         document, or null.&lt;br /&gt;
     */&lt;br /&gt;
    public static NodeList getNodeList(Node node, String xpath) {&lt;br /&gt;
        if (node == null) {&lt;br /&gt;
            throw new IllegalArgumentException(&lt;br /&gt;
                    &amp;quot;null &amp;quot;document&amp;quot; arg in method call.&amp;quot;);&lt;br /&gt;
        } else if (xpath == null) {&lt;br /&gt;
            throw new IllegalArgumentException(&lt;br /&gt;
                    &amp;quot;null &amp;quot;xpath&amp;quot; arg in method call.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        try {&lt;br /&gt;
            XPath xpathEvaluater = xPathFactory.newXPath();&lt;br /&gt;
            if (xpath.endsWith(ELEMENT_NAME_FUNC)) {&lt;br /&gt;
                return (NodeList) xpathEvaluater.evaluate(xpath.substring(0,&lt;br /&gt;
                        xpath.length() - ELEMENT_NAME_FUNC.length()), node,&lt;br /&gt;
                        XPathConstants.NODESET);&lt;br /&gt;
            } else {&lt;br /&gt;
                return (NodeList) xpathEvaluater.evaluate(xpath, node,&lt;br /&gt;
                        XPathConstants.NODESET);&lt;br /&gt;
            }&lt;br /&gt;
        } catch (XPathExpressionException e) {&lt;br /&gt;
            throw new IllegalArgumentException(&amp;quot;bad &amp;quot;xpath&amp;quot; expression [&amp;quot;&lt;br /&gt;
                    + xpath + &amp;quot;].&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Parse with XPath ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
import javax.xml.xpath.XPath;&lt;br /&gt;
import javax.xml.xpath.XPathConstants;&lt;br /&gt;
import javax.xml.xpath.XPathFactory;&lt;br /&gt;
import org.w3c.dom.NodeList;&lt;br /&gt;
import org.xml.sax.InputSource;&lt;br /&gt;
public class Main {&lt;br /&gt;
  public static void main(String[] args) throws Exception {&lt;br /&gt;
    XPath xpath = XPathFactory.newInstance().newXPath();&lt;br /&gt;
    String xpathExpression = &amp;quot;/howto/topic/@name&amp;quot;;&lt;br /&gt;
    InputSource inputSource = new InputSource(&amp;quot;howto.xml&amp;quot;);&lt;br /&gt;
    NodeList nodes = (NodeList) xpath&lt;br /&gt;
        .evaluate(xpathExpression, inputSource, XPathConstants.NODESET);&lt;br /&gt;
    int j = nodes.getLength();&lt;br /&gt;
    for (int i = 0; i &amp;lt; j; i++) {&lt;br /&gt;
      System.out.println(nodes.item(i).getTextContent());&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Shallow print of node list ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
import java.io.PrintStream;&lt;br /&gt;
import javax.xml.transform.Transformer;&lt;br /&gt;
import javax.xml.transform.dom.DOMSource;&lt;br /&gt;
import javax.xml.transform.stream.StreamResult;&lt;br /&gt;
import org.w3c.dom.Document;&lt;br /&gt;
import org.w3c.dom.NamedNodeMap;&lt;br /&gt;
import org.w3c.dom.Node;&lt;br /&gt;
import org.w3c.dom.NodeList;&lt;br /&gt;
import com.sun.org.apache.xpath.internal.XPathAPI;&lt;br /&gt;
public class MainClass {&lt;br /&gt;
  public static void print(Node node, OutputStream os) {&lt;br /&gt;
    PrintStream ps = new PrintStream(os);&lt;br /&gt;
    switch (node.getNodeType()) {&lt;br /&gt;
    case Node.ELEMENT_NODE:&lt;br /&gt;
      ps.print(&amp;quot;&amp;lt;&amp;quot; + node.getNodeName());&lt;br /&gt;
      NamedNodeMap map = node.getAttributes();&lt;br /&gt;
      for (int i = 0; i &amp;lt; map.getLength(); i++) {&lt;br /&gt;
        ps.print(&amp;quot; &amp;quot; + map.item(i).getNodeName() + &amp;quot;=\&amp;quot;&amp;quot;&lt;br /&gt;
            + map.item(i).getNodeValue() + &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      ps.println(&amp;quot;&amp;gt;&amp;quot;);&lt;br /&gt;
      return;&lt;br /&gt;
    case Node.ATTRIBUTE_NODE:&lt;br /&gt;
      ps.println(node.getNodeName() + &amp;quot;=\&amp;quot;&amp;quot; + node.getNodeValue() + &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
      return;&lt;br /&gt;
    case Node.TEXT_NODE:&lt;br /&gt;
      ps.println(node.getNodeValue());&lt;br /&gt;
      return;&lt;br /&gt;
    case Node.CDATA_SECTION_NODE:&lt;br /&gt;
      ps.println(node.getNodeValue());&lt;br /&gt;
      return;&lt;br /&gt;
    case Node.PROCESSING_INSTRUCTION_NODE:&lt;br /&gt;
      ps.println(node.getNodeValue());&lt;br /&gt;
      return;&lt;br /&gt;
    case Node.DOCUMENT_NODE:&lt;br /&gt;
    case Node.DOCUMENT_FRAGMENT_NODE:&lt;br /&gt;
      ps.println(node.getNodeName() + &amp;quot;=&amp;quot; + node.getNodeValue());&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  static void evalXPath(Document doc, Transformer serializer, String absolute,&lt;br /&gt;
      String relative) throws Exception {&lt;br /&gt;
    NodeList list = XPathAPI.selectNodeList(doc, absolute, doc);&lt;br /&gt;
    Node node = null;&lt;br /&gt;
    // &lt;br /&gt;
    for (int i = 0; (node = list.item(i)) != null; i++) {&lt;br /&gt;
      NodeList innerList = XPathAPI.selectNodeList(node, relative, doc);&lt;br /&gt;
      Node innerNode = null;&lt;br /&gt;
      for (int j = 0; (innerNode = innerList.item(j)) != null; j++) {&lt;br /&gt;
        print(innerNode, System.out);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Use XPath to select node ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import org.jdom.Attribute;&lt;br /&gt;
import org.jdom.Document;&lt;br /&gt;
import org.jdom.Element;&lt;br /&gt;
import org.jdom.input.SAXBuilder;&lt;br /&gt;
import org.jdom.xpath.XPath;&lt;br /&gt;
public class MainClass {&lt;br /&gt;
    public static void main(String[] args) throws Exception {&lt;br /&gt;
        SAXBuilder builder = new SAXBuilder();&lt;br /&gt;
        Document doc = builder.build(new File(&amp;quot;tds.xml&amp;quot;));&lt;br /&gt;
        Attribute attr = (Attribute) XPath.selectSingleNode(doc, &amp;quot;/schedule/@name&amp;quot;);&lt;br /&gt;
        System.out.println(attr.getValue());&lt;br /&gt;
        &lt;br /&gt;
        Element el = new Element(&amp;quot;parent&amp;quot;).addContent(new Element(&amp;quot;child&amp;quot;).setAttribute(&amp;quot;name&amp;quot;, &amp;quot;value&amp;quot;));&lt;br /&gt;
        System.out.println(XPath.selectSingleNode(new Attribute(&amp;quot;foo&amp;quot;, &amp;quot;bar&amp;quot;), &amp;quot;position()&amp;quot;));&lt;br /&gt;
        &lt;br /&gt;
        XPath path = XPath.newInstance(&amp;quot;/schedule/@name&amp;quot;);&lt;br /&gt;
        System.out.println(path.valueOf(doc));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML and XPath utilities ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// Copyright (c) 2003-2009, Jodd Team (jodd.org). All Rights Reserved.&lt;br /&gt;
&lt;br /&gt;
import org.w3c.dom.NamedNodeMap;&lt;br /&gt;
import org.w3c.dom.Node;&lt;br /&gt;
import org.w3c.dom.NodeList;&lt;br /&gt;
import org.w3c.dom.Element;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import java.util.Map;&lt;br /&gt;
/**&lt;br /&gt;
 * Some XML and XPath utilities.&lt;br /&gt;
 */&lt;br /&gt;
public class XmlUtil {&lt;br /&gt;
&lt;br /&gt;
  // ---------------------------------------------------------------- attributes&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns a map of all node&amp;quot;s attributes. All non-attribute nodes are ignored.&lt;br /&gt;
   */&lt;br /&gt;
  public static Map&amp;lt;String, String&amp;gt; getAllAttributes(Node node) {&lt;br /&gt;
    HashMap&amp;lt;String, String&amp;gt; attrs = new HashMap&amp;lt;String, String&amp;gt;();&lt;br /&gt;
    NamedNodeMap nmm = node.getAttributes();&lt;br /&gt;
    for (int j = 0; j &amp;lt; nmm.getLength(); j++) {&lt;br /&gt;
      Node attribute = nmm.item(j);&lt;br /&gt;
      if (attribute.getNodeType() != Node.ATTRIBUTE_NODE) {&lt;br /&gt;
        continue;&lt;br /&gt;
      }&lt;br /&gt;
      attrs.put(attribute.getNodeName(), attribute.getNodeValue());&lt;br /&gt;
    }&lt;br /&gt;
    return attrs;&lt;br /&gt;
  }&lt;br /&gt;
    /**&lt;br /&gt;
   * Returns attribute value of a node or &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; if attribute name not found.&lt;br /&gt;
   * Specified attribute is searched on every call.&lt;br /&gt;
   * Consider {@link #getAllAttributes(org.w3c.dom.Node)} for better performances.&lt;br /&gt;
   */&lt;br /&gt;
  public static String getAttributeValue(Node node, String attrName) {&lt;br /&gt;
    NamedNodeMap nmm = node.getAttributes();&lt;br /&gt;
    for (int j = 0; j &amp;lt; nmm.getLength(); j++) {&lt;br /&gt;
      Node attribute = nmm.item(j);&lt;br /&gt;
      if (attribute.getNodeType() != Node.ATTRIBUTE_NODE) {&lt;br /&gt;
        continue;&lt;br /&gt;
      }&lt;br /&gt;
      String nodeName = attribute.getNodeName();&lt;br /&gt;
      if (nodeName.equals(attrName)) {&lt;br /&gt;
        return attribute.getNodeValue();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return null;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Get element&amp;quot;s attribute value or &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; if attribute not found or empty.&lt;br /&gt;
   */&lt;br /&gt;
  public static String getAttributeValue(Element element, String name) {&lt;br /&gt;
    String value = element.getAttribute(name);&lt;br /&gt;
    if (value.length() == 0) {&lt;br /&gt;
      value = null;&lt;br /&gt;
    }&lt;br /&gt;
    return value;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // ---------------------------------------------------------------- nodelist&lt;br /&gt;
  /**&lt;br /&gt;
   * Filters node list by keeping nodes of specified type.&lt;br /&gt;
   */&lt;br /&gt;
  public static List filterNodeList(NodeList nodeList, short keepNodeType) {&lt;br /&gt;
    return filterNodeList(nodeList, keepNodeType, null);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Filters node list by keeping nodes of specified type and node name.&lt;br /&gt;
   */&lt;br /&gt;
  public static List&amp;lt;Node&amp;gt; filterNodeList(NodeList nodeList, short keepNodeType, String nodeName) {&lt;br /&gt;
    List&amp;lt;Node&amp;gt; nodes = new ArrayList&amp;lt;Node&amp;gt;();&lt;br /&gt;
    for (int k = 0; k &amp;lt; nodeList.getLength(); k++) {&lt;br /&gt;
      Node node = nodeList.item(k);&lt;br /&gt;
      if (node.getNodeType() != keepNodeType) {&lt;br /&gt;
        continue;&lt;br /&gt;
      }&lt;br /&gt;
      if (nodeName != null &amp;amp;&amp;amp; (node.getNodeName().equals(nodeName) == false)) {&lt;br /&gt;
        continue;&lt;br /&gt;
      }&lt;br /&gt;
      nodes.add(node);&lt;br /&gt;
    }&lt;br /&gt;
    return nodes;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Filter node list for all Element nodes.&lt;br /&gt;
   */&lt;br /&gt;
  public static List filterNodeListElements(NodeList nodeList) {&lt;br /&gt;
    return filterNodeListElements(nodeList, null);&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Filter node list for Element nodes of specified name.&lt;br /&gt;
   */&lt;br /&gt;
  public static List&amp;lt;Node&amp;gt; filterNodeListElements(NodeList nodeList, String nodeName) {&lt;br /&gt;
    List&amp;lt;Node&amp;gt; nodes = new ArrayList&amp;lt;Node&amp;gt;();&lt;br /&gt;
    for (int k = 0; k &amp;lt; nodeList.getLength(); k++) {&lt;br /&gt;
      Node node = nodeList.item(k);&lt;br /&gt;
      if (node.getNodeType() != Node.ELEMENT_NODE) {&lt;br /&gt;
        continue;&lt;br /&gt;
      }&lt;br /&gt;
      if (nodeName != null &amp;amp;&amp;amp; (node.getNodeName().equals(nodeName) == false)) {&lt;br /&gt;
        continue;&lt;br /&gt;
      }&lt;br /&gt;
      nodes.add(node);&lt;br /&gt;
    }&lt;br /&gt;
    return nodes;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns a list of all child Elements,&lt;br /&gt;
   */&lt;br /&gt;
  public static List getChildElements(Node node) {&lt;br /&gt;
    return getChildElements(node, null);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns a list of child Elements of specified name.&lt;br /&gt;
   */&lt;br /&gt;
  public static List getChildElements(Node node, String nodeName) {&lt;br /&gt;
    NodeList childs = node.getChildNodes();&lt;br /&gt;
    return filterNodeListElements(childs, nodeName);&lt;br /&gt;
  }&lt;br /&gt;
  // ---------------------------------------------------------------- node&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns value of first available child text node or &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; if not found.&lt;br /&gt;
   */&lt;br /&gt;
  public static String getFirstChildTextNodeValue(Node node) {&lt;br /&gt;
    NodeList children = node.getChildNodes();&lt;br /&gt;
    int len = children.getLength();&lt;br /&gt;
    for (int i = 0; i &amp;lt; len; i++) {&lt;br /&gt;
      Node n = children.item(i);&lt;br /&gt;
      if (n.getNodeType() == Node.TEXT_NODE) {&lt;br /&gt;
        return n.getNodeValue();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return null;&lt;br /&gt;
  }&lt;br /&gt;
  /**&lt;br /&gt;
   * Returns value of single child text node or &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
   */&lt;br /&gt;
  public static String getChildTextNodeValue(Node node) {&lt;br /&gt;
    if (node.getChildNodes().getLength() != 1) {&lt;br /&gt;
      return null;&lt;br /&gt;
    }&lt;br /&gt;
    Node item0 = node.getChildNodes().item(0);&lt;br /&gt;
    if (item0.getNodeType() != Node.TEXT_NODE) {&lt;br /&gt;
      return null;&lt;br /&gt;
    }&lt;br /&gt;
    return item0.getNodeValue();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>