Core Class Android

//package com.cicadalane.androlate;
/*
 * Copyright (C) 2011 cicada.software@gmail.com
 *
 * Licensed 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.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
class XmlUtils {
  public static List getChildrenByTagName(Element parent, String name) {
    return XmlUtils.getChildrenByTagName(parent, new String[] { name });
  }
  public static List getChildrenByTagName(Element parent,
      String[] names) {
    List nodeList = new ArrayList();
    for (Node child = parent.getFirstChild(); child != null; child = child
        .getNextSibling()) {
      if (child.getNodeType() == Node.ELEMENT_NODE) {
        for (String name : names) {
          if (name.equals(child.getNodeName())) {
            nodeList.add((Element) child);
            break;
          }
        }
      }
    }
    return nodeList;
  }
  public static Element getFirstChildByTagName(Element parent, String name) {
    List list = XmlUtils.getChildrenByTagName(parent,
        new String[] { name });
    if (list.size() > 0)
      return list.get(0);
    else
      return null;
  }
  public static String getInnerXml(Node node)
      throws ParserConfigurationException,
      TransformerFactoryConfigurationError, TransformerException {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < node.getChildNodes().getLength(); i++)
      sb.append(getOuterXml(node.getChildNodes().item(i)));
    return sb.toString();
  }
  public static String getOuterXml(Node n)
      throws ParserConfigurationException,
      TransformerFactoryConfigurationError, TransformerException {
    Transformer xformer = TransformerFactory.newInstance().newTransformer();
    xformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
    // initialize StreamResult with File object to save to file
    StreamResult result = new StreamResult(new StringWriter());
    DOMSource source = new DOMSource(n);
    xformer.transform(source, result);
    String xmlString = result.getWriter().toString();
    return xmlString;
  }
  public static DocumentFragment parseFragment(Document doc, String xml)
      throws SAXException, IOException, ParserConfigurationException {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentFragment fragment = doc.createDocumentFragment();
    String wellformedxml = "<__parseFragment__>" + xml
        + "";
    Document fragmentdoc = dbf.newDocumentBuilder().parse(
        new InputSource(new StringReader(wellformedxml)));
    Node node = doc.importNode(fragmentdoc.getDocumentElement(), true);
    while (node.hasChildNodes()) {
      fragment.appendChild(node.removeChild(node.getFirstChild()));
    }
    return fragment;
  }
  public static void removeAllChildren(Node node) {
    while (node.hasChildNodes()) {
      node.removeChild(node.getFirstChild());
    }
  }
  public static void setInnerXml(Node node, String xml) throws SAXException,
      IOException, ParserConfigurationException {
    DocumentFragment fragment;
    fragment = XmlUtils.parseFragment(node.getOwnerDocument(), xml);
    XmlUtils.removeAllChildren(node);
    node.appendChild(fragment);
    return;
  }
  /*
   * save a XML Document to a file
   */
  public static void writeXmlFile(Document doc, String filename)
      throws TransformerConfigurationException, TransformerException,
      IOException {
    writeXmlFile(doc, filename, true);
  }
  public static void writeXmlFile(Document doc, String filename,
      boolean indent) throws TransformerConfigurationException,
      TransformerException, IOException {
    Source source = new DOMSource(doc);
    FileOutputStream outputStream = new FileOutputStream(filename);
    Result result = new StreamResult(new OutputStreamWriter(outputStream,
        "UTF8"));
    doc.setXmlStandalone(true);
    // Write the DOM document to the file
    TransformerFactory factory = TransformerFactory.newInstance();
    factory.setAttribute("indent-number", 4);
    Transformer xformer = factory.newTransformer();
    xformer.setOutputProperty(OutputKeys.INDENT, "yes");
    xformer.setOutputProperty(OutputKeys.METHOD, "xml");
    xformer.setOutputProperty(OutputKeys.ENCODING, "UTF8");
    xformer.transform(source, result);
  }
}