package com.elink.util;
/*
* <p>Company: 凌科软件 www.elingke.com </p>
* @author liubaojun
* @version 1.0
* Created on 2004-11-29
* 来源于 elinkBSP 部分源代码
*/
import java.io.*;
import java.util.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.w3c.dom.*;
import org.xml.sax.*;
public class XmlUtil
{
public static synchronized Document newDocument()
{
Document doc = null;
try
{
DocumentBuilder db = DocumentBuilderFactory.newInstance().
newDocumentBuilder();
doc = db.newDocument();
}
catch (Exception e)
{
LogUtil.logException( e );
}
return doc;
}
public static synchronized Element createRootElement()
{
Element rootElement = null;
try
{
DocumentBuilder db = DocumentBuilderFactory.newInstance().
newDocumentBuilder();
Document doc = db.newDocument();
rootElement = doc.getDocumentElement();
}
catch (Exception e)
{
e.printStackTrace();
}
return rootElement;
}
public static synchronized Element getRootElement(String fileName)
{
if (fileName == null || fileName.length() == 0)
{
return null;
}
try
{
Element rootElement = null;
FileInputStream fis = new FileInputStream(fileName);
rootElement = getRootElement(fis);
fis.close();
return rootElement;
}
catch (Exception e)
{
return null;
}
}
public static synchronized Element getRootElement(InputStream is)
{
if (is == null)
{
return null;
}
Element rootElement = null;
try
{
DocumentBuilder db = DocumentBuilderFactory.newInstance().
newDocumentBuilder();
Document doc = db.parse(is);
rootElement = doc.getDocumentElement();
}
catch (Exception e)
{
e.printStackTrace();
}
return rootElement;
}
public static synchronized Element getRootElement(InputSource is)
{
if (is == null)
{
return null;
}
Element rootElement = null;
try
{
DocumentBuilder db = DocumentBuilderFactory.newInstance().
newDocumentBuilder();
Document doc = db.parse(is);
rootElement = doc.getDocumentElement();
}
catch (Exception e)
{
e.printStackTrace();
}
return rootElement;
}
public static synchronized Element[] getChildElements(Element element)
{
if (element == null)
{
return null;
}
Vector childs = new Vector();
for (Node node = element.getFirstChild(); node != null;
node = node.getNextSibling())
{
if (node instanceof Element)
{
childs.add( (Element)node);
}
}
Element[] elmt = new Element[childs.size()];
childs.toArray(elmt);
return elmt;
}
public static synchronized Element[] getChildElements(Element element,
String childName)
{
if (element == null || childName == null || childName.length() == 0)
{
return null;
}
Vector childs = new Vector();
for (Node node = element.getFirstChild(); node != null;
node = node.getNextSibling())
{
if (node instanceof Element)
{
if (node.getNodeName().equals(childName))
{
childs.add( (Element)node);
}
}
}
Element[] elmt = new Element[childs.size()];
childs.toArray(elmt);
return elmt;
}
public static synchronized Node[] getChildNodes(Node node)
{
if (node == null)
{
return null;
}
Vector childs = new Vector();
for (Node n = node.getFirstChild(); n != null;
n = n.getNextSibling())
{
childs.add( (Element)n);
}
Node[] childNodes = new Element[childs.size()];
childs.toArray(childNodes);
return childNodes;
}
public static synchronized Element getChildElement(Element element,
String childName)
{
if (element == null || childName == null || childName.length() == 0)
{
return null;
}
Element childs = null;
for (Node node = element.getFirstChild(); node != null;
node = node.getNextSibling())
{
if (node instanceof Element)
{
if (node.getNodeName().equals(childName))
{
childs = (Element)node;
break;
}
}
}
return childs;
}
public static synchronized Element getChildElement(Element element)
{
if (element == null)
{
return null;
}
Element childs = null;
for (Node node = element.getFirstChild(); node != null;
node = node.getNextSibling())
{
if (node instanceof Element)
{
childs = (Element)node;
break;
}
}
return childs;
}
public static synchronized String[] getElenentValues(Element element)
{
if (element == null)
{
return null;
}
Vector childs = new Vector();
for (Node node = element.getFirstChild(); node != null;
node = node.getNextSibling())
{
if (node instanceof Text)
{
childs.add(node.getNodeValue());
}
}
String[] values = new String[childs.size()];
childs.toArray(values);
return values;
}
public static synchronized String getElenentValue(Element element)
{
if (element == null)
{
return null;
}
String retnStr = null;
for (Node node = element.getFirstChild(); node != null;
node = node.getNextSibling())
{
if (node instanceof Text)
{
String str = node.getNodeValue();
if (str == null || str.length() == 0
|| str.trim().length() == 0)
{
continue;
}
else
{
retnStr = str;
break;
}
}
}
return retnStr;
}
public static synchronized Element findElementByName(Element e, String name)
{
if (e == null || name == null || name.length() == 0)
{
return null;
}
String nodename = null;
Element[] childs = getChildElements(e);
for (int i = 0; i < childs.length; i++)
{
nodename = childs[i].getNodeName();
if (name.equals(nodename))
{
return childs[i];
}
}
for (int i = 0; i < childs.length; i++)
{
Element retn = findElementByName(childs[i], name);
if (retn != null)
{
return retn;
}
}
return null;
}
public static synchronized Element findElementByAttr(Element e, String attrName,
String attrVal)
{
return findElementByAttr( e, attrName, attrVal, true );
}
public static synchronized Element findElementByAttr(Element e, String attrName,
String attrVal, boolean dept)
{
if (e == null || attrName == null || attrName.length() == 0
|| attrVal == null || attrVal.length() == 0)
{
return null;
}
String tmpValue = null;
Element[] childs = getChildElements(e);
for (int i = 0; i < childs.length; i++)
{
tmpValue = childs[i].getAttribute(attrName);
if (attrVal.equals(tmpValue))
{
return childs[i];
}
}
if( dept )
{
for (int i = 0; i < childs.length; i++)
{
Element retn = findElementByAttr(childs[i], attrName, attrVal);
if (retn != null)
{
return retn;
}
}
}
return null;
}
public static synchronized String formatXml(Element e)
{
return formatXml(e, 0);
}
/**
* 格式化XML输出串.
*/
public static synchronized String formatXml(Element e, int indent)
{
indent++;
for (Node n = e.getFirstChild(); n != null; n = n.getNextSibling())
{
appendIndent(e, n, indent);
if (!n.getNodeName().equals("#text"))
{
formatXml( (Element)n, indent);
}
}
indent--;
appendIndent(e, indent);
return e.toString();
}
/**
* 在指定的节点前插入格式表示.
*/
private static synchronized void appendIndent(Element e, Node pos, int indent)
{
Document doc = e.getOwnerDocument();
if (indent == 0)
{
e.insertBefore(doc.createTextNode("\n"), pos);
}
for (int i = 0; i < indent; i++)
{
if (i == 0)
{
e.insertBefore(doc.createTextNode("\n\t"), pos);
}
else
{
e.insertBefore(doc.createTextNode("\t"), pos);
}
}
}
/**
* 追加格式表示.
*/
private static synchronized void appendIndent(Element e, int indent)
{
Document doc = e.getOwnerDocument();
if (indent == 0)
{
e.appendChild(doc.createTextNode("\n"));
}
for (int i = 0; i < indent; i++)
{
if (i == 0)
{
e.appendChild(doc.createTextNode("\n\t"));
}
else
{
e.appendChild(doc.createTextNode("\t"));
}
}
}
public static synchronized void setAttribute(Element e, String name, String value)
{
if (e == null || name == null || name.length() == 0 || value == null
|| value.length() == 0)
return;
else
e.setAttribute( name, value );
}
public static synchronized String getAttribute(Element e, String name)
{
return getAttribute( e, name, null );
}
public static synchronized String getAttribute(Element e, String name, String defval)
{
if( e == null || name == null || name.length()== 0 )
return defval;
else
return e.getAttribute(name);
}
public void transformerWrite( Element doc, String filename ) throws Exception
{
DOMSource doms = new DOMSource( doc );
File f = new File( filename );
StreamResult sr = new StreamResult( f );
transformerWrite( doms, sr );
}
public void transformerWrite( Element doc, File file ) throws Exception
{
DOMSource doms = new DOMSource( doc );
StreamResult sr = new StreamResult( file );
transformerWrite( doms, sr );
}
public void transformerWrite( Element doc, OutputStream outstream ) throws Exception
{
DOMSource doms = new DOMSource( doc );
StreamResult sr = new StreamResult( outstream );
transformerWrite( doms, sr );
}
public void transformerWrite( Element doc, Writer outwriter ) throws Exception
{
DOMSource doms = new DOMSource( doc );
StreamResult sr = new StreamResult( outwriter );
transformerWrite( doms, sr );
}
public void transformerWrite( DOMSource doms, StreamResult sr ) throws Exception
{
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
t.setOutputProperty( OutputKeys.ENCODING, "GBK" );
t.transform( doms, sr );
}
}