/* * DOM.java * * Created on June 20, 2006, 12:31 PM * * (C) R. Alexander Milowski alex@milowski.com */ package org.exist.atom.util; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * * @author R. Alexander Milowski */ public class DOM { /** Creates a new instance of DOM */ private DOM() { } public static void forEachChild(Element parent,NodeHandler filter) { Node current = parent.getFirstChild(); while (current!=null) { Node toProcess = current; current = current.getNextSibling(); filter.process(parent,toProcess); } } public static void findChildren(Element parent,String namespaceName,String localName,NodeHandler filter) { Node current = parent.getFirstChild(); while (current!=null) { if (current.getNodeType()!=Node.ELEMENT_NODE) { current = current.getNextSibling(); continue; } if ((namespaceName==null && current.getNamespaceURI()!=null) || (namespaceName!=null && !namespaceName.equals(current.getNamespaceURI())) ) { current = current.getNextSibling(); continue; } if (current.getLocalName().equals(localName)) { Node toProcess = current; current = current.getNextSibling(); filter.process(parent,toProcess); } else { current = current.getNextSibling(); } } } public static Element findChild(Element parent,String namespaceName,String localName) { Node current = parent.getFirstChild(); while (current!=null) { if (current.getNodeType()!=Node.ELEMENT_NODE) { current = current.getNextSibling(); continue; } if ((namespaceName==null && current.getNamespaceURI()!=null) || (namespaceName!=null && !namespaceName.equals(current.getNamespaceURI())) ) { current = current.getNextSibling(); continue; } if (current.getLocalName().equals(localName)) { return (Element)current; } current = current.getNextSibling(); } return null; } public static Element replaceTextElement(Element parent,String namespaceName,String localName,String value,boolean firstChild) { return DOM.replaceTextElement(parent,namespaceName,localName,value,firstChild,false); } public static Element replaceTextElement(Element parent,String namespaceName,String localName,String value,boolean firstChild,boolean wrap) { Element textE = DOM.findChild(parent,namespaceName,localName); if (textE==null) { textE = parent.getOwnerDocument().createElementNS(namespaceName,localName); if (firstChild) { if (wrap) { parent.insertBefore(parent.getOwnerDocument().createTextNode("\n"),parent.getFirstChild()); } parent.insertBefore(textE,parent.getFirstChild()); } else { parent.appendChild(textE); if (wrap) { parent.appendChild(parent.getOwnerDocument().createTextNode("\n")); } } } DOM.removeChildren(textE); textE.appendChild(parent.getOwnerDocument().createTextNode(value)); return textE; } public static void replaceText(Element textE,String value) { DOM.removeChildren(textE); textE.appendChild(textE.getOwnerDocument().createTextNode(value)); } public static void removeChildren(Element parent) { Node current = parent.getFirstChild(); while (current!=null) { Node toRemove = current; current = current.getNextSibling(); parent.removeChild(toRemove); } } public static String textContent(Node n) { if (n.getNodeType()==Node.ELEMENT_NODE) { StringBuilder builder = new StringBuilder(); Node current = n.getFirstChild(); while (current!=null) { int type = current.getNodeType(); if (type==Node.CDATA_SECTION_NODE || type==Node.TEXT_NODE) { builder.append(current.getNodeValue()); } current = current.getNextSibling(); } return builder.toString(); } else { return n.getNodeValue(); } } }