以前解析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");
分享到:
相关推荐
DOM解析器与JDOM类似,将整个XML文档加载到内存中形成一个树形结构,便于操作,但同样不适合处理大型XML文件。 在选择XML解析器时,需要考虑以下因素: - **性能**:如果XML文件较小,可以选择DOM或JDOM;对于大型...
虽然它是JDK 1.6引入的新特性之一,但由于其独立性较强,因此可以通过第三方库如Apache XML Security Project等方式在较早版本的JDK(如JDK 1.4和JDK 1.5)中使用。 #### JSR105 Service Provider问题 在JDK 1.4和...
例如,JDK自带的`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`可用于构建和操作DOM树。 2. SAX解析: SAX解析器不将整个文档加载到内存,而是通过事件处理器接口(如`ContentHandler`)...
对于JDK 1.6,开发者需要掌握如何使用Java类库,如java.io和java.util,以及如何利用JDBC(Java Database Connectivity)连接和操作MySQL数据库。对于jQuery,理解选择器语法、事件处理和动画效果的创建是基础。同时...
8. **XML处理**:如DOM和SAX解析器,以及JAXB绑定。 9. **JavaMail**:发送和接收电子邮件的API。 10. **Java加密**:提供密码学服务,如加密、解密、数字签名和哈希算法。 通过深入学习这份“java核心类库使用大全...
早期 JDK 为我们提供了两种 xml 解析技术 DOM 和 Sax 简介(已经过时,但我们需要知道这两种技术) dom 解析技术是 W3C 组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。 Java 对 dom ...
还有用于XML处理的工具类库,比如dom4j,是一个易用且开源的库,用于XML,支持DOM、SAX和JAXP等接口。JXPath可以使用Xpath语法操纵符合Java类命名规范的JavaBeans。NekoHtml是一个简单的HTML扫描器和标签补偿器,...
API(Application Programming Interface)是JDK的核心部分,提供了丰富的类库供开发者使用,以实现各种功能。JDK1.6 API中文版是这个版本的API文档的中文翻译,对于中国开发者来说,这是一个极其有用的参考资料,...
- **改进的XML处理**:包括SAX和DOM解析器的性能提升,以及StAX(Streaming API for XML)的集成。 - **改进的JDBC**:支持更强大的连接池管理,增强了SQL语句的处理。 2. **JDK 1.6.0_12 更新内容**: - **安全...
1. **java.xml**:这部分源码涉及到Java的XML处理,包括解析、操作和生成XML文档的API,如DOM、SAX和JAXB。它涵盖了Java标准版中的XML支持,使开发者能够使用Java处理XML数据。 2. **jdk.management.agent**:这...
Java Development Kit(JDK)是Java编程语言的核心组件,它包含了一个Java运行环境(JRE)、编译器(javac)、各种工具(如jar、javadoc等)以及Java类库,使得开发者能够编写、编译、调试和运行Java程序。JDK的不同...
最后,"Java2_类库"还包含了许多其他的模块,如XML处理(DOM、SAX、JAXB)、国际化(I18N)、日志框架(java.util.logging)、定时任务(java.util.Timer)等。这些都极大地丰富了Java的开发环境,提高了开发效率。 ...
5. **开发工具**:涵盖了JDK自带的开发工具,如javac编译器、jar打包工具、javadoc文档生成器等,以及如何使用这些工具进行开发。 6. **部署和安全**:讨论了Java应用的部署策略、网络应用的安全控制,以及如何使用...
- 加强了XML处理,包括SAX和DOM解析器的性能提升,以及JAXB的增强。 - 引入了新的并发工具类,如ConcurrentHashMap和Fork/Join框架,帮助开发者编写更高效的多线程代码。 除此之外,JDK1.6还对垃圾收集机制进行了...
- **XML解析性能提升:** JDK 6.0引入了基于SAX和DOM的新XML解析器,提升了XML处理的性能,减少了内存消耗。 - **JavaScript引擎Rhino:** JDK 6.0集成了Mozilla的Rhino JavaScript引擎,使得Java应用可以执行...
8. **XML处理**:JDK 1.6增强了对XML的支持,包括SAX、DOM和StAX解析器,使得开发者能更高效地处理XML文档。 9. **安全性**:JDK 1.6在安全性方面也有所提升,加强了对恶意代码的防护,并引入了更强的加密算法。 ...
Java开发工具JDK 1.4免安装版是一款专为编程人员设计的Java开发环境,无需繁琐的安装过程,可以直接解压使用。JDK(Java Development Kit)是Oracle公司提供的用于开发Java应用程序的重要软件包,它包含了Java编译器...
此外,XML处理能力的提升,包括DOM、SAX和StaX解析器的改进,使得XML数据处理更加便捷。 在安全方面,JDK1.6加强了对网络连接、文件系统访问和权限控制的管理,以防止恶意代码对系统的侵害。同时,证书和密钥管理也...
3. **XML处理**:更新了DOM、SAX和StAX API,提高了XML处理的效率和灵活性。 4. **改进的网络功能**:新增了对IPv6的全面支持,以及HTTP连接池,提升了网络应用程序的性能。 5. **动态语言支持**:JDK 6开始引入了...
5. **改进的XML处理**:JDK 1.6对DOM、SAX和StAX等XML解析API进行了改进,处理XML文档的速度和效率更高。 6. **增强的安全性**:此版本加强了加密算法和安全策略,提升了程序的健壮性和安全性。 7. **JMX(Java ...