以前解析XML我一直都是使用dom4j的, 用的多了发现只要把JDK自带的类稍微包装一下就可以实现和dom4j一样的风格, 于是动手开始实现. 实现之后发现使用编写的DOM工具类来操作XML比dom4j还有简单, 而且不用第三方的JAR包, 呵呵, 真是意外收获啊. 使用DOM工具类来添加,删除, 修改, 查找XML那时出奇的简单. 只写了一个类, 而去掉了一个JAR包, 何乐而不为呢. 拿出来和大家分享. 欢迎批评指正.
1. 环境
JDK1.6
2. 代码
package com.hxrainbow.xml;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
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.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
public class Dom {
private Element e;
private Dom(Element element){
this.e = element;
}
public void print(){
NodeList nodeList = e.getChildNodes();
for(int i=0;i<nodeList.getLength();i++){
Node node = nodeList.item(i);
System.out.println("节点名: " + node.getNodeName() + ", 节点值: " + node.getNodeValue() + ", 节点类型: " + node.getNodeType());
}
}
public Element getDomElement(){
return e;
}
public static Dom newDom(String rootName)throws XmlException{
Document doc = null;
try {
DocumentBuilder dombuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
doc = dombuilder.newDocument();
doc.setXmlStandalone(true);
} catch (Exception e) {
throw new XmlException(e.getMessage(), e);
}
Element root = doc.createElement(rootName);
doc.appendChild(root);
return new Dom(root);
}
public static Dom getRoot(InputStream is)throws XmlException{
Document doc = null;
try {
DocumentBuilder dombuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
doc = dombuilder.parse(is);
} catch (Exception e) {
throw new XmlException(e.getMessage(), e);
}
Element root = doc.getDocumentElement();
return new Dom(root);
}
public static Dom getRoot(String xmlFile)throws XmlException{
try {
InputStream is = new FileInputStream(xmlFile);
Dom root = getRoot(is);
is.close();
return root;
} catch (Exception e) {
throw new XmlException(e.getMessage(), e);
}
}
public String getAttributeValue(String attributeName){
return e.getAttribute(attributeName);
}
public boolean existElement(String elementName){
NodeList nodeList = e.getElementsByTagName(elementName);
if((nodeList == null) || (nodeList.getLength() < 1)){
return false;
}
return true;
}
public String elementText(String elementName){
Element element = (Element)e.getElementsByTagName(elementName).item(0);
Node textNode = element.getFirstChild();
if(textNode == null){
return "";
}
return textNode.getNodeValue();
}
public Dom element(String elementName){
NodeList nodeList = e.getElementsByTagName(elementName);
if((nodeList == null) || (nodeList.getLength() < 1)){
return null;
}
Element element = (Element)nodeList.item(0);
return new Dom(element);
}
public List<Dom> elements(String elementName){
List<Dom> eList = new ArrayList<Dom>();
NodeList nodeList = e.getElementsByTagName(elementName);
if(nodeList == null){
return eList;
}
for(int i=0;i<nodeList.getLength();i++){
Node node = nodeList.item(i);
if(node.getNodeType() == Node.ELEMENT_NODE){
Element element = (Element)node;
eList.add(new Dom(element));
}
}
return eList;
}
public Dom addElement(String name){
Document document = e.getOwnerDocument();
Element element = document.createElement(name);
e.appendChild(element);
return new Dom(element);
}
public Dom addElement(String name, String value){
Document document = e.getOwnerDocument();
Element element = document.createElement(name);
e.appendChild(element);
Text text = document.createTextNode(value);
element.appendChild(text);
return new Dom(element);
}
//添加或修改属性
public Dom setAttribute(String name, String value){
e.setAttribute(name, value);
return this;
}
public void remove(Dom subDom){
e.removeChild(subDom.getDomElement());
}
public void removeElement(String name){
NodeList nodeList = e.getElementsByTagName(name);
if(nodeList == null){
return ;
}
for(int i=0;i<nodeList.getLength();i++){
e.removeChild(nodeList.item(i));
}
}
public void removeAttribute(String name){
e.removeAttribute(name);
}
public Dom updateElementText(String name, String value){
Element element = (Element)e.getElementsByTagName(name).item(0);
Node textNode = element.getFirstChild();
textNode.setNodeValue(value);
return new Dom(element);
}
public Dom updateElementText(String value){
Node textNode = e.getFirstChild();
textNode.setNodeValue(value);
return this;
}
public String getElementText(){
Node textNode = e.getFirstChild();
return textNode.getNodeValue();
}
public void write(OutputStream os){
write(os, "UTF-8");
}
public void write(OutputStream os, String encoding){
try {
TransformerFactory tFactory = TransformerFactory.newInstance();
tFactory.setAttribute("indent-number", 2);
Transformer transformer = tFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, encoding);
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
transformer.transform(new DOMSource(e.getOwnerDocument()), new StreamResult(new OutputStreamWriter(os)));
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
public void write(String xmlFile)throws XmlException{
write(xmlFile, "UTF-8");
}
public void write(String xmlFile, String encoding)throws XmlException{
try {
OutputStream os = new FileOutputStream(xmlFile);
write(os, encoding);
os.close();
} catch (Exception e) {
throw new XmlException(e.getMessage(), e);
}
}
}
class XmlException extends RuntimeException {
private static final long serialVersionUID = 1L;
public XmlException(String message){
super(message);
}
public XmlException(String message, Throwable cause){
super(message, cause);
}
}
3. 使用的xml文件test.xml
<?xml version="1.0"?>
<configuration>
<property>
<name a="1">host</name>
<value>http://192.168.3.249</value>
<description>系统主机地址</description>
</property>
<property>
<name>login</name>
<value>/page/Default.aspx</value>
<description>登陆页面</description>
</property>
</configuration>
4. 用法
1>解析xml
Dom root = Dom.getRoot("d:/test.xml");
List<Dom> pList = root.elements("property");
for(Dom d: pList ){
System.out.println(d.elementText("name") + ", " + d.elementText("value") + ", " + d.elementText("description"));
}
2>修改xml
Dom root = Dom.getRoot("d:/test.xml");
List<Dom> pList = root.elements("property");
Dom d = pList.get(0);
Dom nameDom = d.element("name");
nameDom.setAttribute("a", "2");
nameDom.setAttribute("b", "3");
nameDom.updateElementText("测试呵呵");
d.updateElementText("description", "按当地");
root.write("d:/test.xml");
3>新建xml
Dom root = Dom.newDom("configuration");
Dom propertyDom = root.addElement("property");
propertyDom.addElement("name ", "名称");
propertyDom.addElement("value", "值");
Dom dDom = propertyDom.addElement("description", "描述");
dDo.setAttribute("a", "2");
root.write("d:/test.xml");
分享到:
相关推荐
JDK自带xml解析器dom+sax JDK自带xml解析器dom+sax JDK自带xml解析器dom+sax
使用JDK1.6自带的方法解析XML特定格式的字符串,将压缩包中的两个java类解压到同一个目录内,导入eclipse更改包路径,直接运行test.java即可。
多使用类库,培养对编程的热爱。 虽然我到现在对类库的使用频率也很低,但总有一天会熟练使用的吧。希望到时候就不是Java从入门到入土了。 最后希望设置的0积分不会被系统篡改吧!!!
使用jdk自带的jar工具打jar包 采用命令行的方式 方便 快捷
利用jdk自带算法实现的AES加解密工具类及Base64编解码工具类、 文件操作工具类、aes扩展无限制权限策略文件等。 在jdk1.7环境亲测通过。
java jdk 类库详解中文版chm格式
这个一个比较详细的说明文档,对于初学者很有帮助
本案例详细介绍了JDK自带线程池,与spring的线程池相比,其更好,希望对大家有帮助
只要针对xml文件定义一个javaBean类,传入类的class对象,就可以通过本工具自动返回带有数据的bean类的实例。定义类的类名必要是标签名,类的属性对应标签的属性。本工具可以实现嵌套标签的解析,对应的bean定义规则...
详细介绍了jdk自带的工具的使用方法等 JDK自带工具分析 1 1、工具分类概括: 2 1.1、基本工具 2 1.2、安全工具 3 1.3、Java国际化工具 3 1.4、远程方法调用工具 3 1.5、Java IDL and RMI-IIOP 工具 3 1.6、Java 部署...
JDK自带调试工具doc JDK自带调试工具doc JDK自带调试工具doc
jdk1.8.rar
JDK自带的jarsigner签名工具帮助文档,指导大家用自带的JDK通过控制台签名apk;主要指令如下:jarsigner -verbose -keystore [您的签名存放路径]-signedjar [签名后的文件名] [未签名的文件名] [您的证书名称]
json-lib-2.4-jdk15依赖的库文件: 压缩包内容: commons-beanutils-1.8.0.jar commons-collections-3.1.jar commons-lang-2.5.jar commons-logging-1.1.1.jar ezmorph-1.0.6.jar json-lib-2.4-jdk15-javadoc.jar ...
2.Java方面,使用dom4j对xml进行操作,包括节点的读取,添加,修改,删除。 3.Flex方面,使用DataGrid呈现数据;使用RemoteObject构建和Java的通信;使用到了验证控件Validator;使用了CSS样式对Alert对话框进行了...
这是google翻译过来的JDK9的API中文版,里面包含了所有JDK9实现的类库这是google翻译过来的JDK9的API中文版,里面包含了所有JDK9实现的类库
简单建立数据库连接池及简单包装查询代码 使用JDK自带日志输出日志
NULL 博文链接:https://samjavaeye.iteye.com/blog/938657
jdk1.7 64位 官方正式版下载。... EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。 ME(J2ME),micro edition,主要用于移动设备、嵌入,开发必备神器,导入即用
Java文档-jdk-6u10-docs-java类库6.0-高压缩第一部分