package com.xml;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* 类名:XmlCreater
*
* 类描述: 创建DOM并生成XML文件
*
* 编写者 :luoc
*
* 编写日期 :2005-6-22
*
* 主要public成员变量:
*
* 主要public方法:
*
**/
public class XmlCreater {
/* 全局变量 */
private Logger logger = Logger.getLogger(getClass().getName());
private Document doc = null;// 新创建的DOM
private String path = null;// 生成的XML文件绝对路径
/**
* 构造函数说明:
*
* 参数说明:@param path xml文件路径
*
**/
public XmlCreater(String path) {
this.path = path;
init();
}
/**
* 方法名称:init
*
* 方法功能: 初始化函数
*
* 参数说明:
*
* 返回:void
*
* 作者:luoc 日期:2005-6-22
**/
private void init() {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.newDocument();// 新建DOM
} catch (ParserConfigurationException e) {
logger.error("Parse DOM builder error:" + e);
}
}
/**
* 方法名称:createRootElement
*
* 方法功能:创建根结点,并返回
*
* 参数说明:@param rootTagName
*
* 返回:Element
*
* 作者:luoc 日期:2005-6-22
**/
public Element createRootElement(String rootTagName) {
if (doc.getDocumentElement() == null) {
logger.debug("create root element '" + rootTagName + "' success.");
Element root = doc.createElement(rootTagName);
doc.appendChild(root);
return root;
}
logger.warn("this dom's root element is exist,create fail.");
return doc.getDocumentElement();
}
/**
* 方法名称:createElement
*
* 方法功能:在parent结点下增加子结点tagName
*
* 参数说明:@param parent 参数说明:@param tagName
*
* 返回:Element
*
* 作者:luoc 日期:2005-6-22
**/
public Element createElement(Element parent, String tagName) {
Document doc = parent.getOwnerDocument();
Element child = doc.createElement(tagName);
parent.appendChild(child);
return child;
}
/**
* 方法名称:createElement
*
* 方法功能:在parent结点下增加值为value的子结点tabName
*
* 参数说明:@param parent 参数说明:@param tagName 参数说明:@param value
*
* 返回:Element
*
* 作者:luoc 日期:2005-6-22
**/
public Element createElement(Element parent, String tagName, String value) {
Document doc = parent.getOwnerDocument();
Element child = doc.createElement(tagName);
XmlOper.setElementValue(child, value);
parent.appendChild(child);
return child;
}
/**
* 方法名称:createAttribute
*
* 方法功能:在parent结点下增加属性
*
* 参数说明:@param parent 参数说明:@param attrName 属性名 参数说明:@param attrValue 属性值
*
* 返回:void
*
* 作者:luoc 日期:2005-6-22
**/
public void createAttribute(Element parent, String attrName, String attrValue) {
XmlOper.setElementAttr(parent, attrName, attrValue);
}
/**
* 方法名称:buildXmlFile
*
* 方法功能:根据DOM生成XML文件
*
* 参数说明:
*
* 返回:void
*
* 作者:luoc 日期:2005-6-22
**/
public void buildXmlFile() {
TransformerFactory tfactory = TransformerFactory.newInstance();
try {
Transformer transformer = tfactory.newTransformer();
DOMSource source = new DOMSource(doc);
logger.debug("New DOMSource success.");
StreamResult result = new StreamResult(new File(path));
logger.debug("New StreamResult success.");
transformer.setOutputProperty("encoding", "utf-8");
transformer.transform(source, result);
logger.debug("Build XML File '" + path + "' success.");
} catch (TransformerConfigurationException e) {
logger.error("Create Transformer error:" + e);
} catch (TransformerException e) {
logger.error("Transformer XML file error:" + e);
}
}
/**
* @return 返回 doc。
*/
public Document getDoc() {
return doc;
}
/**
* @param doc
* 要设置的 doc。
*/
public void setDoc(Document doc) {
this.doc = doc;
}
/**
* @return 返回 path。
*/
public String getPath() {
return path;
}
/**
* @param path
* 要设置的 path。
*/
public void setPath(String path) {
this.path = path;
}
}
package com.xml;
import java.util.ArrayList;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* 类名:XmlOper
*
* 类描述:对XML文件进行读写操作,均为静态函数
*
* 编写者 :luoc
*
* 编写日期 :2005-6-22
*
* 主要public成员变量:
*
* 主要public方法:
*
**/
public class XmlOper {
/* 全局变量 */
static Logger logger = Logger.getLogger("XmlOper");
/**
* 构造函数说明:
*
* 参数说明:
*
**/
private XmlOper() {
}
/**
* 方法名称:getNodeList
*
* 方法功能:获取父结点parent的所有子结点
*
* 参数说明:@param parent 参数说明:@return
*
* 返回:NodeList
*
* 作者:luoc 日期:2005-6-22
**/
public static NodeList getNodeList(Element parent) {
return parent.getChildNodes();
}
/**
* 方法名称:getElementsByName
*
* 方法功能:在父结点中查询指定名称的结点集
*
* 参数说明:@param parent 参数说明:@param name 参数说明:@return
*
* 返回:Element[]
*
* 作者:luoc 日期:2005-6-22
**/
public static Element[] getElementsByName(Element parent, String name) {
ArrayList resList = new ArrayList();
NodeList nl = getNodeList(parent);
for (int i = 0; i < nl.getLength(); i++) {
Node nd = nl.item(i);
if (nd.getNodeName().equals(name)) {
resList.add(nd);
}
}
Element[] res = new Element[resList.size()];
for (int i = 0; i < resList.size(); i++) {
res[0] = (Element) resList.get(i);
}
logger.debug(parent.getNodeName() + "'s children of " + name + "'s num:" + res.length);
return res;
}
/**
* 方法名称:getElementName
*
* 方法功能:获取指定Element的名称
*
* 参数说明:@param element 参数说明:@return
*
* 返回:String
*
* 作者:luoc 日期:2005-6-22
**/
public static String getElementName(Element element) {
return element.getNodeName();
}
/**
* 方法名称:getElementValue
*
* 方法功能:获取指定Element的值
*
* 参数说明:@param element 参数说明:@return
*
* 返回:String
*
* 作者:luoc 日期:2005-6-22
**/
public static String getElementValue(Element element) {
NodeList nl = element.getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
if (nl.item(i).getNodeType() == Node.TEXT_NODE) {// 是一个Text Node
logger.debug(element.getNodeName() + " has a Text Node.");
return element.getFirstChild().getNodeValue();
}
}
logger.error(element.getNodeName() + " hasn't a Text Node.");
return null;
}
/**
* 方法名称:getElementAttr
*
* 方法功能:获取指定Element的属性attr的值
*
* 参数说明:@param element 参数说明:@param attr 参数说明:@return
*
* 返回:String
*
* 作者:luoc 日期:2005-6-22
**/
public static String getElementAttr(Element element, String attr) {
return element.getAttribute(attr);
}
/**
* 方法名称:setElementValue
*
* 方法功能:设置指定Element的值
*
* 参数说明:@param element 参数说明:@param val
*
* 返回:void
*
* 作者:luoc 日期:2005-6-22
**/
public static void setElementValue(Element element, String val) {
Node node = element.getOwnerDocument().createTextNode(val);
NodeList nl = element.getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
Node nd = nl.item(i);
if (nd.getNodeType() == Node.TEXT_NODE)// 是一个Text Node
{
nd.setNodeValue(val);
logger.debug("modify " + element.getNodeName() + "'s node value succe.");
return;
}
}
logger.debug("new " + element.getNodeName() + "'s node value succe.");
element.appendChild(node);
}
/**
* 方法名称:setElementAttr
*
* 方法功能:设置结点Element的属性
*
* 参数说明:@param element 参数说明:@param attr 参数说明:@param attrVal
*
* 返回:void
*
* 作者:luoc 日期:2005-6-22
**/
public static void setElementAttr(Element element, String attr, String attrVal) {
element.setAttribute(attr, attrVal);
}
/**
* 方法名称:addElement
*
* 方法功能:在parent下增加结点child
*
* 参数说明:@param parent 参数说明:@param child
*
* 返回:void
*
* 作者:luoc 日期:2005-6-22
**/
public static void addElement(Element parent, Element child) {
parent.appendChild(child);
}
/**
* 方法名称:addElement
*
* 方法功能:在parent下增加字符串tagName生成的结点
*
* 参数说明:@param parent 参数说明:@param tagName
*
* 返回:void
*
* 作者:luoc 日期:2005-6-22
**/
public static void addElement(Element parent, String tagName) {
Document doc = parent.getOwnerDocument();
Element child = doc.createElement(tagName);
parent.appendChild(child);
}
/**
* 方法名称:addElement
*
* 方法功能:在parent下增加tagName的Text结点,且值为text
*
* 参数说明:@param parent 参数说明:@param tagName 参数说明:@param text
*
* 返回:void
*
* 作者:luoc 日期:2005-6-22
**/
public static void addElement(Element parent, String tagName, String text) {
Document doc = parent.getOwnerDocument();
Element child = doc.createElement(tagName);
setElementValue(child, text);
parent.appendChild(child);
}
/**
* 方法名称:removeElement
*
* 方法功能:将父结点parent下的名称为tagName的结点移除
*
* 参数说明:@param parent 参数说明:@param tagName
*
* 返回:void
*
* 作者:luoc 日期:2005-6-22
**/
public static void removeElement(Element parent, String tagName) {
logger.debug("remove " + parent.getNodeName() + "'s children by tagName " + tagName + " begin...");
NodeList nl = parent.getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
Node nd = nl.item(i);
if (nd.getNodeName().equals(tagName)) {
parent.removeChild(nd);
logger.debug("remove child '" + nd + "' success.");
}
}
logger.debug("remove " + parent.getNodeName() + "'s children by tagName " + tagName + " end.");
}
}
package com.xml;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
/**
* 类名:XmlBuilder
*
* 类描述:根据传入的XML文件生成Document和root结点
*
* 编写者 :luoc
*
* 编写日期 :2005-6-22
*
* 主要public成员变量:
*
* 主要public方法:
*
**/
public class XmlBuilder {
/* 全局变量 */
private String path = null;// xml文件路径
private Document doc = null;// xml文件对应的document
private Element root = null;// xml文件的根结点
private Logger logger = Logger.getLogger(getClass().getName());
public XmlBuilder(String path) {
this.path = path;
init();
}
/**
* 方法名称:init
*
* 方法功能:初始化函数
*
* 参数说明:
*
**/
public void init() {
buildDocument();
buildRoot();
}
/**
* 方法名称:buildDocument
*
* 方法功能:将XML文件生成Document
*
* 参数说明:
*
* 返回:void
*
**/
private void buildDocument() {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
logger.debug("Construct document builder success.");
doc = builder.parse(new File(path));
logger.debug("Build xml document success.");
} catch (ParserConfigurationException e) {
logger.error("Construct document builder error:" + e);
} catch (SAXException e) {
logger.error("Parse xml file error:" + e);
} catch (IOException e) {
logger.error("Read xml file error:" + e);
}
}
/**
* 方法名称:buildRoot
*
* 方法功能:生成XML的根结点
*
* 参数说明:
*
* 返回:void
*
* 作者:luoc 日期:2005-6-22
**/
private void buildRoot() {
root = doc.getDocumentElement();
}
/**
* @return 返回 doc。
*/
public Document getDoc() {
return doc;
}
/**
* @param doc
* 要设置的 doc。
*/
public void setDoc(Document doc) {
this.doc = doc;
}
/**
* @return 返回 path。
*/
public String getPath() {
return path;
}
/**
* @param path
* 要设置的 path。
*/
public void setPath(String path) {
this.path = path;
}
/**
* @return 返回 root。
*/
public Element getRoot() {
return root;
}
/**
* @param root
* 要设置的 root。
*/
public void setRoot(Element root) {
this.root = root;
}
}