Java Tutorial/XML/Node

Материал из Java эксперт
Перейти к: навигация, поиск

Add another element after the first child of the root element

   <source lang="java">

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.Element; public class Main {

 public static void main(String[] argv) throws Exception {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setValidating(true);
   factory.setExpandEntityReferences(false);
   Document doc = factory.newDocumentBuilder().parse(new File("filename"));
   Element element = doc.getElementById("key1");
   element = doc.createElement("root");
   doc.appendChild(element);
   Element element2 = doc.createElement("item");
   element.insertBefore(element2, element.getFirstChild().getNextSibling());
 }

}</source>





Add a text node before the last child of the element

   <source lang="java">

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.Element; public class Main {

 public static void main(String[] argv) throws Exception {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setValidating(true);
   factory.setExpandEntityReferences(false);
   Document doc = factory.newDocumentBuilder().parse(new File("filename"));
   Element element = doc.getElementById("key1");
   element = doc.createElement("root");
   doc.appendChild(element);
   element.insertBefore(doc.createTextNode("C"), element.getLastChild());
 }

}</source>





Add a text node in front of the new item element

   <source lang="java">

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.Element; public class Main {

 public static void main(String[] argv) throws Exception {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setValidating(true);
   factory.setExpandEntityReferences(false);
   Document doc = factory.newDocumentBuilder().parse(new File("filename"));
   Element element = doc.getElementById("key1");
   element = doc.createElement("root");
   doc.appendChild(element);
   element.getParentNode().insertBefore(doc.createTextNode("B"), element);
 }

}</source>





Add a text node to the beginning of the element

   <source lang="java">

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.Element; public class Main {

 public static void main(String[] argv) throws Exception {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setValidating(true);
   factory.setExpandEntityReferences(false);
   Document doc = factory.newDocumentBuilder().parse(new File("filename"));
   Element element = doc.getElementById("key1");
   element = doc.createElement("root");
   doc.appendChild(element);
   element.insertBefore(doc.createTextNode("A"), element.getFirstChild());
 }

}</source>





Add a text node to the element

   <source lang="java">

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.Element; public class Main {

 public static void main(String[] argv) throws Exception {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setValidating(true);
   factory.setExpandEntityReferences(false);
   Document doc = factory.newDocumentBuilder().parse(new File("filename"));
   Element element = doc.getElementById("key1");
   element = doc.createElement("root");
   doc.appendChild(element);
   element.appendChild(doc.createTextNode("D"));
 }

}</source>





Adding a Text Node to a DOM Document

   <source lang="java">

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; public class Main {

 public static void main(String[] argv) throws Exception {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setValidating(true);
   factory.setExpandEntityReferences(false);
   Document doc = factory.newDocumentBuilder().parse(new File("filename"));
   Element element = doc.getDocumentElement();
   Text text = doc.createTextNode("data\n");
   element.appendChild(text);
   text = doc.createTextNode("<>&\""");
   element.appendChild(text);
 }

}</source>





Change a particular node in XML

   <source lang="java">

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; public class Main {

 public static void main(String[] args) throws Exception {
   Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
       new InputSource("data.xml"));
   XPath xpath = XPathFactory.newInstance().newXPath();
   NodeList nodes = (NodeList) xpath.evaluate("//employee/name[text()="old"]", doc,
       XPathConstants.NODESET);
   for (int idx = 0; idx < nodes.getLength(); idx++) {
     nodes.item(idx).setTextContent("new value");
   }
   Transformer xformer = TransformerFactory.newInstance().newTransformer();
   xformer.transform(new DOMSource(doc), new StreamResult(new File("data_new.xml")));
 }

}</source>





Compare two DOM Nodes

   <source lang="java">

/**

*  Licensed to the Apache Software Foundation (ASF) under one
*  or more contributor license agreements.  See the NOTICE file
*  distributed with this work for additional information
*  regarding copyright ownership.  The ASF licenses this file
*  to you 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.
*/

import java.util.ArrayList; import java.util.List; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; /**

* @version $Rev: 514087 $ $Date: 2007-03-03 01:13:40 -0500 (Sat, 03 Mar 2007) $
*/

public class DOMUtils {

 private static void trimEmptyTextNodes(Node node) {
   Element element = null;
   if (node instanceof Document) {
     element = ((Document) node).getDocumentElement();
   } else if (node instanceof Element) {
     element = (Element) node;
   } else {
     return;
   }
   List<Node> nodesToRemove = new ArrayList<Node>();
   NodeList children = element.getChildNodes();
   for (int i = 0; i < children.getLength(); i++) {
     Node child = children.item(i);
     if (child instanceof Element) {
       trimEmptyTextNodes(child);
     } else if (child instanceof Text) {
       Text t = (Text) child;
       if (t.getData().trim().length() == 0) {
         nodesToRemove.add(child);
       }
     }
   }
   for (Node n : nodesToRemove) {
     element.removeChild(n);
   }
 }
 public static void compareNodes(Node expected, Node actual, boolean trimEmptyTextNodes)
     throws Exception {
   if (trimEmptyTextNodes) {
     trimEmptyTextNodes(expected);
     trimEmptyTextNodes(actual);
   }
   compareNodes(expected, actual);
 }
 public static void compareNodes(Node expected, Node actual) throws Exception {
   if (expected.getNodeType() != actual.getNodeType()) {
     throw new Exception("Different types of nodes: " + expected + " " + actual);
   }
   if (expected instanceof Document) {
     Document expectedDoc = (Document) expected;
     Document actualDoc = (Document) actual;
     compareNodes(expectedDoc.getDocumentElement(), actualDoc.getDocumentElement());
   } else if (expected instanceof Element) {
     Element expectedElement = (Element) expected;
     Element actualElement = (Element) actual;
     // compare element names
     if (!expectedElement.getLocalName().equals(actualElement.getLocalName())) {
       throw new Exception("Element names do not match: " + expectedElement.getLocalName() + " "
           + actualElement.getLocalName());
     }
     // compare element ns
     String expectedNS = expectedElement.getNamespaceURI();
     String actualNS = actualElement.getNamespaceURI();
     if ((expectedNS == null && actualNS != null)
         || (expectedNS != null && !expectedNS.equals(actualNS))) {
       throw new Exception("Element namespaces names do not match: " + expectedNS + " " + actualNS);
     }
     String elementName = "{" + expectedElement.getNamespaceURI() + "}"
         + actualElement.getLocalName();
     // compare attributes
     NamedNodeMap expectedAttrs = expectedElement.getAttributes();
     NamedNodeMap actualAttrs = actualElement.getAttributes();
     if (countNonNamespaceAttribures(expectedAttrs) != countNonNamespaceAttribures(actualAttrs)) {
       throw new Exception(elementName + ": Number of attributes do not match up: "
           + countNonNamespaceAttribures(expectedAttrs) + " "
           + countNonNamespaceAttribures(actualAttrs));
     }
     for (int i = 0; i < expectedAttrs.getLength(); i++) {
       Attr expectedAttr = (Attr) expectedAttrs.item(i);
       if (expectedAttr.getName().startsWith("xmlns")) {
         continue;
       }
       Attr actualAttr = null;
       if (expectedAttr.getNamespaceURI() == null) {
         actualAttr = (Attr) actualAttrs.getNamedItem(expectedAttr.getName());
       } else {
         actualAttr = (Attr) actualAttrs.getNamedItemNS(expectedAttr.getNamespaceURI(),
             expectedAttr.getLocalName());
       }
       if (actualAttr == null) {
         throw new Exception(elementName + ": No attribute found:" + expectedAttr);
       }
       if (!expectedAttr.getValue().equals(actualAttr.getValue())) {
         throw new Exception(elementName + ": Attribute values do not match: "
             + expectedAttr.getValue() + " " + actualAttr.getValue());
       }
     }
     // compare children
     NodeList expectedChildren = expectedElement.getChildNodes();
     NodeList actualChildren = actualElement.getChildNodes();
     if (expectedChildren.getLength() != actualChildren.getLength()) {
       throw new Exception(elementName + ": Number of children do not match up: "
           + expectedChildren.getLength() + " " + actualChildren.getLength());
     }
     for (int i = 0; i < expectedChildren.getLength(); i++) {
       Node expectedChild = expectedChildren.item(i);
       Node actualChild = actualChildren.item(i);
       compareNodes(expectedChild, actualChild);
     }
   } else if (expected instanceof Text) {
     String expectedData = ((Text) expected).getData().trim();
     String actualData = ((Text) actual).getData().trim();
     if (!expectedData.equals(actualData)) {
       throw new Exception("Text does not match: " + expectedData + " " + actualData);
     }
   }
 }
 private static int countNonNamespaceAttribures(NamedNodeMap attrs) {
   int n = 0;
   for (int i = 0; i < attrs.getLength(); i++) {
     Attr attr = (Attr) attrs.item(i);
     if (!attr.getName().startsWith("xmlns")) {
       n++;
     }
   }
   return n;
 }

}</source>





Compare two DOM Nodes from JBoss

   <source lang="java">

/**

* JBoss, Home of Professional Open Source
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/

import java.util.ArrayList; import java.util.List; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /**

* @author 
* @version $Revision: 3282 $ $Id: XMLUtil.java 3282 2007-11-01
*          15:32:29Z timfox $
*/

public class Utils {

 public static void assertEquivalent(Node node, Node node2) {
   if (node == null) {
     throw new IllegalArgumentException("the first node to be compared is null");
   }
   if (node2 == null) {
     throw new IllegalArgumentException("the second node to be compared is null");
   }
   if (!node.getNodeName().equals(node2.getNodeName())) {
     throw new IllegalArgumentException("nodes have different node names");
   }
   int attrCount = 0;
   NamedNodeMap attrs = node.getAttributes();
   if (attrs != null) {
     attrCount = attrs.getLength();
   }
   int attrCount2 = 0;
   NamedNodeMap attrs2 = node2.getAttributes();
   if (attrs2 != null) {
     attrCount2 = attrs2.getLength();
   }
   if (attrCount != attrCount2) {
     throw new IllegalArgumentException("nodes hava a different number of attributes");
   }
   outer: for (int i = 0; i < attrCount; i++) {
     Node n = attrs.item(i);
     String name = n.getNodeName();
     String value = n.getNodeValue();
     for (int j = 0; j < attrCount; j++) {
       Node n2 = attrs2.item(j);
       String name2 = n2.getNodeName();
       String value2 = n2.getNodeValue();
       if (name.equals(name2) && value.equals(value2)) {
         continue outer;
       }
     }
     throw new IllegalArgumentException("attribute " + name + "=" + value + " doesn"t match");
   }
   boolean hasChildren = node.hasChildNodes();
   if (hasChildren != node2.hasChildNodes()) {
     throw new IllegalArgumentException("one node has children and the other doesn"t");
   }
   if (hasChildren) {
     NodeList nl = node.getChildNodes();
     NodeList nl2 = node2.getChildNodes();
     short[] toFilter = new short[] { Node.TEXT_NODE, Node.ATTRIBUTE_NODE, Node.ruMENT_NODE };
     List nodes = filter(nl, toFilter);
     List nodes2 = filter(nl2, toFilter);
     int length = nodes.size();
     if (length != nodes2.size()) {
       throw new IllegalArgumentException("nodes hava a different number of children");
     }
     for (int i = 0; i < length; i++) {
       Node n = (Node) nodes.get(i);
       Node n2 = (Node) nodes2.get(i);
       assertEquivalent(n, n2);
     }
   }
 }
 private static List filter(NodeList nl, short[] typesToFilter) {
   List nodes = new ArrayList();
   outer: for (int i = 0; i < nl.getLength(); i++) {
     Node n = nl.item(i);
     short type = n.getNodeType();
     for (int j = 0; j < typesToFilter.length; j++) {
       if (typesToFilter[j] == type) {
         continue outer;
       }
     }
     nodes.add(n);
   }
   return nodes;
 }

}</source>





Convert node element To String

   <source lang="java">

/**

* JBoss, Home of Professional Open Source
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/

import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /**

* @author 
* @version $Revision: 3282 $ $Id: XMLUtil.java 3282 2007-11-01
*          15:32:29Z timfox $
*/

public class Utils {

 public static String elementToString(Node n) {
   String name = n.getNodeName();
   short type = n.getNodeType();
   if (Node.CDATA_SECTION_NODE == type) {
     return "<![CDATA[" + n.getNodeValue() + "]]>";
   }
   if (name.startsWith("#")) {
     return "";
   }
   StringBuffer sb = new StringBuffer();
   sb.append("<").append(name);
   NamedNodeMap attrs = n.getAttributes();
   if (attrs != null) {
     for (int i = 0; i < attrs.getLength(); i++) {
       Node attr = attrs.item(i);
       sb.append(" ").append(attr.getNodeName()).append("=\"").append(attr.getNodeValue()).append(
           "\"");
     }
   }
   String textContent = null;
   NodeList children = n.getChildNodes();
   if (children.getLength() == 0) {
     if ((textContent = XMLUtil.getTextContent(n)) != null && !"".equals(textContent)) {
       sb.append(textContent).append("</").append(name).append(">");
       ;
     } else {
       sb.append("/>").append("\n");
     }
   } else {
     sb.append(">").append("\n");
     boolean hasValidChildren = false;
     for (int i = 0; i < children.getLength(); i++) {
       String childToString = elementToString(children.item(i));
       if (!"".equals(childToString)) {
         sb.append(childToString);
         hasValidChildren = true;
       }
     }
     if (!hasValidChildren && ((textContent = XMLUtil.getTextContent(n)) != null)) {
       sb.append(textContent);
     }
     sb.append("</").append(name).append(">");
   }
   return sb.toString();
 }

}</source>





Convert NodeList To Node Array

   <source lang="java">

import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class Utils {

 public static Node[] convertToArray(NodeList list)
 {
     int length = list.getLength();
     Node[] copy = new Node[length];
     
     for (int n = 0; n < length; ++n)
         copy[n] = list.item(n);
     
     return copy;
 }

}</source>





Copies the source tree into the specified place in a destination tree.

   <source lang="java">

import org.w3c.dom.Attr; import org.w3c.dom.DOMException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import com.sun.org.apache.xerces.internal.dom.AttrImpl; import com.sun.org.apache.xerces.internal.dom.DocumentImpl; /*

* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/

public class Main {

 /**
  * Copies the source tree into the specified place in a destination
  * tree. The source node and its children are appended as children
  * of the destination node.
*

* Note: This is an iterative implementation. */ public static void copyInto(Node src, Node dest) throws DOMException { // get node factory Document factory = dest.getOwnerDocument(); boolean domimpl = factory instanceof DocumentImpl; // placement variables Node start = src; Node parent = src; Node place = src; // traverse source tree while (place != null) { // copy this node Node node = null; int type = place.getNodeType(); switch (type) { case Node.CDATA_SECTION_NODE: { node = factory.createCDATASection(place.getNodeValue()); break; } case Node.ruMENT_NODE: { node = factory.createComment(place.getNodeValue()); break; } case Node.ELEMENT_NODE: { Element element = factory.createElement(place.getNodeName()); node = element; NamedNodeMap attrs = place.getAttributes(); int attrCount = attrs.getLength(); for (int i = 0; i < attrCount; i++) { Attr attr = (Attr)attrs.item(i); String attrName = attr.getNodeName(); String attrValue = attr.getNodeValue(); element.setAttribute(attrName, attrValue); if (domimpl && !attr.getSpecified()) { ((AttrImpl)element.getAttributeNode(attrName)).setSpecified(false); } } break; } case Node.ENTITY_REFERENCE_NODE: { node = factory.createEntityReference(place.getNodeName()); break; } case Node.PROCESSING_INSTRUCTION_NODE: { node = factory.createProcessingInstruction(place.getNodeName(), place.getNodeValue()); break; } case Node.TEXT_NODE: { node = factory.createTextNode(place.getNodeValue()); break; } default: { throw new IllegalArgumentException("can"t copy node type, "+ type+" ("+ node.getNodeName()+")"); } } dest.appendChild(node); // iterate over children if (place.hasChildNodes()) { parent = place; place = place.getFirstChild(); dest = node; } // advance else { place = place.getNextSibling(); while (place == null && parent != start) { place = parent.getNextSibling(); parent = parent.getParentNode(); dest = dest.getParentNode(); } } } } // copyInto(Node,Node) }</source>

Create a new element and move the middle text node to it

   <source lang="java">

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; public class Main {

 public static void main(String[] argv) throws Exception {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setValidating(true);
   factory.setExpandEntityReferences(false);
   Document doc = factory.newDocumentBuilder().parse(new File("filename"));
   Element element = doc.getDocumentElement();
   Text text1 = (Text) element.getFirstChild();
   String string = text1.getData();
   String word = "some";
   Text text2 = text1.splitText(string.indexOf(word));
   
   Element newElement = doc.createElement("b");
   newElement.appendChild(text2);
 }

}</source>





DOM helper for root element

   <source lang="java">

/**

* 
*/

//org.ajax4jsf.builder.xml; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document; import org.w3c.dom.DocumentFragment; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; /**

* This class must read XML file from input stream and can extract body of root
* element for include into target in generation.
* 
* @author shura
* 
*/

public class XMLBody {

 private Document xmlDocument;
 private Element rootElement;
 /**
  * Load XML document and parse it into DOM.
  * 
  * @param input
  * @throws ParsingException
  */
 public void loadXML(InputStream input) throws Exception {
   try {
     // Create Document Builder Factory
     DocumentBuilderFactory docFactory = DocumentBuilderFactory
         .newInstance();
     docFactory.setValidating(false);
     // Create Document Builder
     DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
     
     docBuilder.isValidating();
     
     // Disable loading of external Entityes
     docBuilder.setEntityResolver(new EntityResolver() {
       // Dummi resolver - alvays do nothing
       public InputSource resolveEntity(String publicId, String systemId)
           throws SAXException, IOException {
         return new InputSource(new StringReader(""));
       }
     });
     // open and parse XML-file
     xmlDocument = docBuilder.parse(input);
     // Get Root xmlElement
     rootElement = xmlDocument.getDocumentElement();
   } catch (Exception e) {
     throw new Exception("Error load XML ", e);
   }
 }
 /**
  * Check name of root element is as expected.
  * 
  * @param name
  * @return
  */
 public boolean isRootName(String name) {
   return rootElement.getNodeName().equals(name);
 }
 public String getDoctype() {
   DocumentType doctype = xmlDocument.getDoctype();
   if (null != doctype) {
     return doctype.getName();
   }
   return null;
 }
 public String getPiblicId() {
   DocumentType doctype = xmlDocument.getDoctype();
   if (null != doctype) {
     return doctype.getPublicId();
   }
   return null;
 }
 public String getRootTypeName() {
   return rootElement.getSchemaTypeInfo().getTypeName();
 }
 public String getContent() throws Exception {
   NodeList childNodes = rootElement.getChildNodes();
   return serializeNodes(childNodes);
 }
 private String serializeNodes(NodeList childNodes) throws Exception {
   DocumentFragment fragment = xmlDocument.createDocumentFragment();
   for (int i = 0; i < childNodes.getLength(); i++) {
     fragment.appendChild(childNodes.item(i).cloneNode(true));
   }
   try {
     TransformerFactory transformerFactory = TransformerFactory
         .newInstance();
     Transformer transformer = transformerFactory.newTransformer();
     transformer.setOutputProperty("omit-xml-declaration", "yes");
     StringWriter out = new StringWriter();
     StreamResult result = new StreamResult(out);
     transformer.transform(new DOMSource(fragment), result);
     return out.toString();
   } catch (Exception e) {
     throw new Exception(e);
   }
 }
 
 public String getContent(String xpath) throws Exception{
   XPath path = XPathFactory.newInstance().newXPath();
   NodeList childNodes;
   try {
     childNodes = (NodeList) path.evaluate(xpath, xmlDocument,XPathConstants.NODESET);
   } catch (XPathExpressionException e) {
     throw new Exception("Error evaluate xpath",e);
   }
   return serializeNodes(childNodes);
 }

}</source>





Find the first text descendent node of an element

   <source lang="java">

/*

* Copyright (C) 2001  Christian Cryder [christianc@granitepeaks.ru]
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*
* $Id: DOMUtil.java 114 2005-12-09 15:51:51Z christianc $
*/

import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.util.Iterator; import org.w3c.dom.Attr; import org.w3c.dom.CharacterData; import org.w3c.dom.rument; import org.w3c.dom.DOMException; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; /**

* DOM related utility functions.
*/

public class DOMUtil {

   private static byte[] sep = System.getProperty("line.separator").getBytes();
   /**
    * Find the first text descendent node of an element.
    * This recursively looks more than one level to search
    * for text in font nodes, etc.
    *
    * @param node The starting node for the search.
    * @return The text node or null if not found.
    */
   public static Text findFirstText(Node node) {
       if (node instanceof Text) return (Text) node;
       for (Node child = node.getFirstChild(); child!=null; child = child.getNextSibling()) {
           Text text = findFirstText(child);
           if (text!=null) return text;
       }
       return null;
   }
   /**
    * Gets the first text descendent node of an element.
    * This recursively looks more than one level to search
    * for text in font nodes, etc. Throws a DOMException
    * if the Text object is not found.
    *
    * @param node The starting node for the search.
    * @return The text node or null if not found.
    * @throws DOMException if the Text object is not found
    */
   public static Text getFirstText(Node node) {
       Text text = findFirstText(node);
       if (text==null) {
           String msg = "No child text mode found for element";
           String id = getID(node);
           throw new DOMException((short) -1, msg+(id!=null ? "; id=\""+id+"\"" : ""));
       }
       return text;
   }
   /**
    * Automatically set text in a Node. Basically we find the first
    * Text node beneath the current node and replace it with a
    * CDATASection for the incoming text. All other Text nodes are
    * removed. Throws a DOMException if it"s illegal to add a Text
    * child to the particular node.
    *
    * @param node the starting node for the search.
    * @param text the text to be set
    * @param allowMarkupInText whether to allow markup in text to pass through unparsed
    * @return the updated node
    * @throws DOMException if the Text object is not found
    */
   public static Node setTextInNode(Node node, String text, boolean allowMarkupInText) {
       //start by setting the value in the first text node we find with a comment
       Comment comment = node.getOwnerDocument().createComment("");
       Node newNode = null;
       
       //csc_092701.1 - support both encoded/unencoded text
       if (allowMarkupInText) newNode = node.getOwnerDocument().createCDATASection(text);
       else newNode = node.getOwnerDocument().createTextNode(text);

//System.out.println ("newNode: "+newNode);

       Text textComp = DOMUtil.findFirstText((Element) node);

//System.out.println ("textComp:"+textComp);

       if (textComp==null) {
           node.appendChild(comment);
       } else {
           Node parent = textComp.getParentNode();
           parent.replaceChild(comment, textComp);
       }
       
       //now remove all the rest of the text nodes
       removeAllTextNodes(node);        
       //now replace the comment with the newNode
       Node parent = comment.getParentNode();
       parent.replaceChild(newNode, comment);

//System.out.println ("parent: "+parent); //System.out.println ("result: "+DOMUtil.findFirstText((Element) parent)); //DOMUtil.printStackTrace(parent.getOwnerDocument().getDocumentElement());

       return node;
   }
   
   /**
    * Remove all text nodes below this node
    *
    * @param node The starting node for the search.
    */
   public static void removeAllTextNodes(Node node) {
       if (node==null) return;
       if (!node.hasChildNodes()) return;
       NodeList nl = node.getChildNodes();
       for (int i=nl.getLength()-1; i>=0; i--) {
           Node n = (Node) nl.item(i);        
           if (n instanceof Text) node.removeChild(n);
           else removeAllTextNodes(n);
       }
   }
   
   /**
    * Given a Node name, return the "id" attribute if it exists.
    * If it does not exist, return null instead. This is basically
    * just a convenience method to cast the node to element and 
    * return the id from that.
    *
    * @param node the node name in question
    * @return the id value for the given node, if it exists. null if 
    *        doesn"t
    */
   public static String getID(Node node) {
       return getID(node, null);
   }
   /**
    * Given a Node, return the "id" attribute if it exists.
    * If it does not exist, return nullResponse instead. This is basically
    * just a convenience method to cast the node to element and 
    * return the id from that.
    *
    * @param node the node in question
    * @param nullResponse the response to be returned if the id attribute
    *        does not exist
    * @return the id value for the given node, if it exists. null if 
    *        doesn"t
    */
   public static String getID(Node node, String nullResponse) {
       String nodeName = nullResponse;
       if (node instanceof Element) {
           nodeName = ((Element) node).getAttribute("id");
       }
       return nodeName;
   }
   protected static void print(OutputStream out, String s) {
       if (out!=null) try {
           out.write(s.getBytes());
           out.write(sep);
       } catch (IOException ioe) {}
   }

}</source>





Get the first text node associated with this element

   <source lang="java">

import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; public class Utils {

 /**
  * Get the first text node associated with this element
  * @param parent the node containing text
  * @return Text (trimmed of leanding/trailing whitespace, null if none)
  */
 public static String getFirstText(Node parent) {
   return getTextNodeByNumber(parent, 1);
 }
 /**
  * Get the specified text node associated with this element
  * @param parent the node containing text
  * @param number The text node to fetch (1st, 2nd, etc)
  * @return Text (trimmed of leanding/trailing whitespace, null if none)
  */
 public static String getTextNodeByNumber(Node parent, int number) {
   String  text  = null;
   int     count = 1;
   if (parent != null) {
     for (Node child = parent.getFirstChild();
               child != null;
               child = child.getNextSibling()) {
       if ((child.getNodeType() == Node.TEXT_NODE) && (count++ == number)) {
         text = child.getNodeValue();
         return text.trim();
       }
     }
   }
   return text;
 }

}</source>





Get the text node

   <source lang="java">

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; public class Main {

 public static void main(String[] argv) throws Exception {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setValidating(true);
   factory.setExpandEntityReferences(false);
   Document doc = factory.newDocumentBuilder().parse(new File("filename"));
   Element element = doc.getDocumentElement();
   Text text1 = (Text) element.getFirstChild();
   String string = text1.getData();
 }

}</source>





Move all children of the element in front of the element

   <source lang="java">

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; public class Main {

 public static void main(String[] argv) throws Exception {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setValidating(true);
   factory.setExpandEntityReferences(false);
   Document doc = factory.newDocumentBuilder().parse(new File("filename"));
   Element element = (Element) doc.getElementsByTagName("b").item(0);
   Node parent = element.getParentNode();
   while (element.hasChildNodes()) {
     parent.insertBefore(element.getFirstChild(), element);
   }
 }

}</source>





Remove All nodes

   <source lang="java">

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class Main {

 public static void main(String[] argv) throws Exception {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setValidating(true);
   factory.setExpandEntityReferences(false);
   Document doc = factory.newDocumentBuilder().parse(new File("filename"));
   removeAll(doc, Node.ELEMENT_NODE, "junk");
   removeAll(doc, Node.ruMENT_NODE, null);
   doc.normalize();  
 }
 public static void removeAll(Node node, short nodeType, String name) {
   if (node.getNodeType() == nodeType && (name == null || node.getNodeName().equals(name))) {
     node.getParentNode().removeChild(node);
   } else {
     NodeList list = node.getChildNodes();
     for (int i = 0; i < list.getLength(); i++) {
       removeAll(list.item(i), nodeType, name);
     }
   }
 }

}</source>





Remove this node from its parent.

   <source lang="java">

/**********************************************************************************

  • Copyright (c) 2003, 2004 The Regents of the University of Michigan, Trustees of Indiana University,
  • Board of Trustees of the Leland Stanford, Jr., University, and The MIT Corporation
  • Licensed under the Educational Community License Version 1.0 (the "License");
  • By obtaining, using and/or copying this Original Work, you agree that you have read,
  • understand, and will comply with the terms and conditions of the Educational Community License.
  • You may obtain a copy of the License at:
  • http://cvs.sakaiproject.org/licenses/license_1_0.html
  • THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  • INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
  • AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  • DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  • FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
                                                                                                                                                                    • /

import org.w3c.dom.Node; public class Utils {

 /**
  * Remove this node from its parent.
  * @param node the node to remove
  * @return Node removed
  */
 public Node removeNode(Node node) {
   return node.getParentNode().removeChild(node);
 }

}</source>





Removing a Node from a DOM Document

   <source lang="java">

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class Main {

 public static void main(String[] argv) throws Exception {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setValidating(true);
   factory.setExpandEntityReferences(false);
   Document doc = factory.newDocumentBuilder().parse(new File("filename"));
   Element element = (Element) doc.getElementsByTagName("junk").item(0);
   element.getParentNode().removeChild(element);
 }

}</source>





Returns a first child DOM Node of type ELEMENT_NODE for the specified Node

   <source lang="java">

/**

* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/

import org.w3c.dom.Node; public final class NodeUtils {

   /**
    * Returns a first child DOM Node of type ELEMENT_NODE
    * for the specified Node.
    */
   public static Node getChildElementNode(Node xmlNode) {
       if (xmlNode == null || !xmlNode.hasChildNodes()) {
           return null;
       }
       
       xmlNode = xmlNode.getFirstChild();
       while (xmlNode != null 
              && xmlNode.getNodeType() != Node.ELEMENT_NODE) {
           xmlNode = xmlNode.getNextSibling();
       }
       return xmlNode;
   }

}</source>





Returns a list of value for the given node

   <source lang="java">

/**

* EasyBeans
* Copyright (C) 2006 Bull S.A.S.
* Contact: easybeans@ow2.org
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
* USA
*
* --------------------------------------------------------------------------
* $Id: XMLUtils.java 2049 2007-11-20 14:32:56Z benoitf $
* --------------------------------------------------------------------------
*/

import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /**

* Class with some useful methods on XML document.
*/

public final class XMLUtils {

 /**
  * Returns a list of value for the given node.
  * @param ns the namespace.
  * @param base the element from where to search.
  * @param name of the element to get.
  * @return the list of value of this element.
  */
 public static List<String> getStringListValueElement(final String ns, final Element base, final String name) {
     List<String> returnedlist = new ArrayList<String>();
     // Get element
     NodeList list = base.getElementsByTagNameNS(ns, name);
     int length = list.getLength();
     // Get all values of all elements
     if (length > 0) {
         for (int i = 0; i < length; i++) {
             Element element = (Element) list.item(i);
             Node node = element.getFirstChild();
             if (node != null) {
                 returnedlist.add(node.getNodeValue());
             }
         }
     }
     return returnedlist;
 }

}</source>





Returns the value of the child node with the given name

   <source lang="java">

/**

* EasyBeans
* Copyright (C) 2006 Bull S.A.S.
* Contact: easybeans@ow2.org
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
* USA
*
* --------------------------------------------------------------------------
* $Id: XMLUtils.java 2049 2007-11-20 14:32:56Z benoitf $
* --------------------------------------------------------------------------
*/

import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /**

* Class with some useful methods on XML document.
*/

public final class XMLUtils {

 /**
  * Returns the value of the child node with the given name.
  * @param base the element from where to search.
  * @param name of the element to get.
  * @return the value of this element.
  */
 public static String getChildStringValueForElement(final Element base, final String name) {
     String value = null;
     NodeList nodeList = base.getChildNodes();
     if (nodeList.getLength() > 0) {
         int length = nodeList.getLength();
         for (int i = 0; i < length; i++) {
             Node node = nodeList.item(i);
             // Get an element, create an instance of the element
             if (Node.ELEMENT_NODE == node.getNodeType()) {
                 if (name.equals(node.getNodeName())) {
                     // Get value of this child
                     Node elNode = ((Element) node).getFirstChild();
                     if (elNode != null) {
                         value = elNode.getNodeValue();
                         break;
                     }
                 }
             }
         }
     }
     return value;
 }

}</source>





Search earlier siblings for a given node

   <source lang="java">

/**********************************************************************************

  • Copyright (c) 2003, 2004 The Regents of the University of Michigan, Trustees of Indiana University,
  • Board of Trustees of the Leland Stanford, Jr., University, and The MIT Corporation
  • Licensed under the Educational Community License Version 1.0 (the "License");
  • By obtaining, using and/or copying this Original Work, you agree that you have read,
  • understand, and will comply with the terms and conditions of the Educational Community License.
  • You may obtain a copy of the License at:
  • http://cvs.sakaiproject.org/licenses/license_1_0.html
  • THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  • INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
  • AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  • DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  • FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
                                                                                                                                                                    • /

import org.w3c.dom.Node; public class Utils {

 /**
  * Search earlier siblings for a given node
  * @param currentNode Starting point for our search
  * @param tagName Node name to look up
  * @return matching Node (null if none)
  */
 public static Node getPreviousSiblingByName(Node currentNode, String tagName) {
   Node node = currentNode.getPreviousSibling();
   while ((node != null) && (!node.getNodeName().equals(tagName))) {
     node = node.getPreviousSibling();
   }
   return node;
 }

}</source>





Search our next siblings for a given node

   <source lang="java">

/**********************************************************************************

  • Copyright (c) 2003, 2004 The Regents of the University of Michigan, Trustees of Indiana University,
  • Board of Trustees of the Leland Stanford, Jr., University, and The MIT Corporation
  • Licensed under the Educational Community License Version 1.0 (the "License");
  • By obtaining, using and/or copying this Original Work, you agree that you have read,
  • understand, and will comply with the terms and conditions of the Educational Community License.
  • You may obtain a copy of the License at:
  • http://cvs.sakaiproject.org/licenses/license_1_0.html
  • THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  • INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
  • AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  • DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  • FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
                                                                                                                                                                    • /

import org.w3c.dom.Node; public class Utils {

 /**
  * Search our next siblings for a given node
  * @param currentNode Starting point for our search
  * @param tagName Node name to look up
  * @return matching Node (null if none)
  */
 public static Node getNextSiblingByName(Node currentNode, String tagName) {
   Node node = currentNode.getNextSibling();
   while ((node != null) && (!node.getNodeName().equals(tagName))) {
     node = node.getNextSibling();
   }
   return node;
 }

}</source>





Search up the tree for a given node

   <source lang="java">

/**********************************************************************************

  • Copyright (c) 2003, 2004 The Regents of the University of Michigan, Trustees of Indiana University,
  • Board of Trustees of the Leland Stanford, Jr., University, and The MIT Corporation
  • Licensed under the Educational Community License Version 1.0 (the "License");
  • By obtaining, using and/or copying this Original Work, you agree that you have read,
  • understand, and will comply with the terms and conditions of the Educational Community License.
  • You may obtain a copy of the License at:
  • http://cvs.sakaiproject.org/licenses/license_1_0.html
  • THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  • INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
  • AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  • DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  • FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
                                                                                                                                                                    • /

import org.w3c.dom.Node; public class Utils {

 /**
  * Search up the tree for a given node
  * @param currentNode Starting point for our search
  * @param tagName Node name to look up
  * @return matching Node (null if none)
  */
 public static Node getPreviousNodeByName(Node currentNode, String tagName) {
   Node node = currentNode.getParentNode();
   while ((node != null) && (!node.getNodeName().equals(tagName))) {
     node = node.getParentNode();
   }
   return node;
 }

}</source>





Simplified implementation of a Node from a Document Object Model (DOM)

   <source lang="java">

/*

* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/

import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator;

/**

* Simplified implementation of a Node from a Document Object Model (DOM)
* parse of an XML document.  This class is used to represent a DOM tree
* so that the XML parser"s implementation of org.w3c.dom need
* not be visible to the remainder of Jasper.
* <p>
* WARNING - Construction of a new tree, or modifications
* to an existing one, are not thread-safe and such accesses must be
* synchronized.
*
* @author Craig R. McClanahan
* @version $Revision: 515 $ $Date: 2008-03-17 22:02:23 +0100 (Mon, 17 Mar 2008) $
*/

public class TreeNode {

   // ----------------------------------------------------------- Constructors
   /**
    * Construct a new node with no parent.
    *
    * @param name The name of this node
    */
   public TreeNode(String name) {
       this(name, null);
   }
   /**
    * Construct a new node with the specified parent.
    *
    * @param name The name of this node
    * @param parent The node that is the parent of this node
    */
   public TreeNode(String name, TreeNode parent) {
       super();
       this.name = name;
       this.parent = parent;
       if (this.parent != null)
           this.parent.addChild(this);
   }
   // ----------------------------------------------------- Instance Variables
   /**
    * The attributes of this node, keyed by attribute name,
    * Instantiated only if required.
    */
   protected HashMap attributes = null;
   /**
    * The body text associated with this node (if any).
    */
   protected String body = null;
   /**
    * The children of this node, instantiated only if required.
    */
   protected ArrayList children = null;
   /**
    * The name of this node.
    */
   protected String name = null;
   /**
    * The parent node of this node.
    */
   protected TreeNode parent = null;
   // --------------------------------------------------------- Public Methods
   /**
    * Add an attribute to this node, replacing any existing attribute
    * with the same name.
    *
    * @param name The attribute name to add
    * @param value The new attribute value
    */
   public void addAttribute(String name, String value) {
       if (attributes == null)
           attributes = new HashMap();
       attributes.put(name, value);
   }
   /**
    * Add a new child node to this node.
    *
    * @param node The new child node
    */
   public void addChild(TreeNode node) {
       if (children == null)
           children = new ArrayList();
       children.add(node);
   }
   /**
    * Return the value of the specified node attribute if it exists, or
    * null otherwise.
    *
    * @param name Name of the requested attribute
    */
   public String findAttribute(String name) {
       if (attributes == null)
           return (null);
       else
           return ((String) attributes.get(name));
   }
   /**
    * Return an Iterator of the attribute names of this node.  If there are
    * no attributes, an empty Iterator is returned.
    */
   public Iterator findAttributes() {
       if (attributes == null)
           return (Collections.EMPTY_LIST.iterator());
       else
           return (attributes.keySet().iterator());
   }
   /**
    * Return the first child node of this node with the specified name,
    * if there is one; otherwise, return null.
    *
    * @param name Name of the desired child element
    */
   public TreeNode findChild(String name) {
       if (children == null)
           return (null);
       Iterator items = children.iterator();
       while (items.hasNext()) {
           TreeNode item = (TreeNode) items.next();
           if (name.equals(item.getName()))
               return (item);
       }
       return (null);
   }
   /**
    * Return an Iterator of all children of this node.  If there are no
    * children, an empty Iterator is returned.
    */
   public Iterator findChildren() {
       if (children == null)
           return (Collections.EMPTY_LIST.iterator());
       else
           return (children.iterator());
   }
   /**
    * Return an Iterator over all children of this node that have the
    * specified name.  If there are no such children, an empty Iterator
    * is returned.
    *
    * @param name Name used to select children
    */
   public Iterator findChildren(String name) {
       if (children == null)
           return (Collections.EMPTY_LIST.iterator());
       ArrayList results = new ArrayList();
       Iterator items = children.iterator();
       while (items.hasNext()) {
           TreeNode item = (TreeNode) items.next();
           if (name.equals(item.getName()))
               results.add(item);
       }
       return (results.iterator());
   }
   /**
    * Return the body text associated with this node (if any).
    */
   public String getBody() {
       return (this.body);
   }
   /**
    * Return the name of this node.
    */
   public String getName() {
       return (this.name);
   }
   /**
    * Remove any existing value for the specified attribute name.
    *
    * @param name The attribute name to remove
    */
   public void removeAttribute(String name) {
       if (attributes != null)
           attributes.remove(name);
   }
   /**
    * Remove a child node from this node, if it is one.
    *
    * @param node The child node to remove
    */
   public void removeNode(TreeNode node) {
       if (children != null)
           children.remove(node);
   }
   /**
    * Set the body text associated with this node (if any).
    *
    * @param body The body text (if any)
    */
   public void setBody(String body) {
       this.body = body;
   }
   /**
    * Return a String representation of this TreeNode.
    */
   public String toString() {
       StringBuffer sb = new StringBuffer();
       toString(sb, 0, this);
       return (sb.toString());
   }
   // ------------------------------------------------------ Protected Methods
   /**
    * Append to the specified StringBuffer a character representation of
    * this node, with the specified amount of indentation.
    *
    * @param sb The StringBuffer to append to
    * @param indent Number of characters of indentation
    * @param node The TreeNode to be printed
    */
   protected void toString(StringBuffer sb, int indent,
                           TreeNode node) {
       int indent2 = indent + 2;
       // Reconstruct an opening node
       for (int i = 0; i < indent; i++)
           sb.append(" ");
       sb.append("<");
       sb.append(node.getName());
       Iterator names = node.findAttributes();
       while (names.hasNext()) {
           sb.append(" ");
           String name = (String) names.next();
           sb.append(name);
           sb.append("=\"");
           String value = node.findAttribute(name);
           sb.append(value);
           sb.append("\"");
       }
       sb.append(">\n");
       // Reconstruct the body text of this node (if any)
       String body = node.getBody();
       if ((body != null) && (body.length() > 0)) {
           for (int i = 0; i < indent2; i++)
               sb.append(" ");
           sb.append(body);
           sb.append("\n");
       }
       // Reconstruct child nodes with extra indentation
       Iterator children = node.findChildren();
       while (children.hasNext()) {
           TreeNode child = (TreeNode) children.next();
           toString(sb, indent2, child);
       }
       // Reconstruct a closing node marker
       for (int i = 0; i < indent; i++)
           sb.append(" ");
       sb.append("</");
       sb.append(node.getName());
       sb.append(">\n");
   }

}</source>





Split the node at the beginning of the word

   <source lang="java">

import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; public class Main {

 public static void main(String[] argv) throws Exception {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   factory.setValidating(true);
   factory.setExpandEntityReferences(false);
   Document doc = factory.newDocumentBuilder().parse(new File("filename"));
   Element element = doc.getDocumentElement();
   Text text1 = (Text) element.getFirstChild();
   String string = text1.getData();
   String word = "some";
   Text text2 = text1.splitText(string.indexOf(word));
 }

}</source>