- 浏览: 239947 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (101)
- js (10)
- java (39)
- HTTP请求:GET与POST方法的区别(转) (1)
- Freemarker 语法规则 (1)
- AJAX级联菜单实例 (1)
- oralce (1)
- myeclipse (5)
- struts (12)
- sql存储过程基础(转) (4)
- JBPM (1)
- mysql (4)
- hibernate (3)
- ibatis (4)
- spring (4)
- 计算机技术 (1)
- nosql (1)
- sqlserver (1)
- servlet (1)
- 拦截器 (1)
- andriod 开发 (1)
- 程序员 (0)
- 多线程 (2)
- Jenkins (1)
- zk (1)
- JPA (2)
最新评论
-
zhangzh888:
怎么下载 啊 都没有看见文件
sftp处理文件 -
wx_hello:
怎么得到文件的属性呢? 比如文件的新建时间
sftp处理文件 -
HappyVeryGood:
“运行时异常(即非受控异常)自动强制执行整个逻辑工作单元的回滚 ...
事物管理,spring事物详解,spring @transactional -
skeely1234:
感谢分享,太帅了
eclipse下修改项目名导致tomcat内发布名不一致的解决方法
[/size][size=x-small][b]xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J)
第一种:SAX解析
SAX处理机制:SAX是一种基于事件驱动的API。利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应,对传递的XML数据进行处理。
测试用的xml文件:db.xml
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<!--<!DOCTYPE dbconfig SYSTEM "db.dtd">-->
<dbconfig>
<db type="oracle">
<driver>oracle.jdbc.driver.OracleDriver</driver>
<url>jdbc:oracle:thin:@localhost:1521:oracle</url>
<user>scott</user>
<password>tiger</password>
</db>
</dbconfig>
<?xml version="1.0" encoding="UTF-8"?>
<!--<!DOCTYPE dbconfig SYSTEM "db.dtd">-->
<dbconfig>
<db type="oracle">
<driver>oracle.jdbc.driver.OracleDriver</driver>
<url>jdbc:oracle:thin:@localhost:1521:oracle</url>
<user>scott</user>
<password>tiger</password>
</db>
</dbconfig>DTD文件db.dtd
Xml代码
<!ELEMENT dbconfig (db+)>
<!ELEMENT db (driver,url,user,password)>
<!ELEMENT driver (#PCDATA)>
<!ELEMENT url (#PCDATA)>
<!ELEMENT user (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ATTLIST db type CDATA #REQUIRED>
<!ELEMENT dbconfig (db+)>
<!ELEMENT db (driver,url,user,password)>
<!ELEMENT driver (#PCDATA)>
<!ELEMENT url (#PCDATA)>
<!ELEMENT user (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ATTLIST db type CDATA #REQUIRED>SAX解析实例一
org.xml.sax.DefalutHandler类: 可以扩展该类,给出自己的解析实现
SAXPrinter.java
Java代码
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXPrinter extends DefaultHandler
{
/** *//**
* 文档开始事件
*/
public void startDocument() throws SAXException
{
System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
}
/** *//**
* 接收处理指令事件
*/
public void processingInstruction(String target, String data) throws SAXException
{
System.out.println("<?"+target+" "+data+"?>");
}
/** *//**
* 元素开始事件
* 参数说明:
* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
* localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
* qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
* attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
*/
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException
{
System.out.print("<"+qName);//输出元素名称
int len=attrs.getLength();//元素属性列表长度
//利用循环输出属性列表
for(int i=0;i<len;i++)
{
System.out.print(" ");
System.out.print(attrs.getQName(i));
System.out.print("=\"");
System.out.print(attrs.getValue(i));
System.out.print("\"");
}
System.out.print(">");
}
/** *//**
* 元素中字符数据事件:接收元素中字符数据
* 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外)
* 2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器
*/
public void characters(char[] ch, int start, int length) throws SAXException
{
System.out.print(new String(ch,start,length));
}
/** *//**
* 结束元素事件
*/
public void endElement(String uri, String localName, String qName) throws SAXException
{
System.out.print("</"+qName+">");
}
public static void main(String[] args)
{
SAXParserFactory spf=SAXParserFactory.newInstance();
try
{
SAXParser sp=spf.newSAXParser();
sp.parse(new File("db.xml"),new SAXPrinter());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXPrinter extends DefaultHandler
{
/** *//**
* 文档开始事件
*/
public void startDocument() throws SAXException
{
System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
}
/** *//**
* 接收处理指令事件
*/
public void processingInstruction(String target, String data) throws SAXException
{
System.out.println("<?"+target+" "+data+"?>");
}
/** *//**
* 元素开始事件
* 参数说明:
* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
* localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
* qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
* attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
*/
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException
{
System.out.print("<"+qName);//输出元素名称
int len=attrs.getLength();//元素属性列表长度
//利用循环输出属性列表
for(int i=0;i<len;i++)
{
System.out.print(" ");
System.out.print(attrs.getQName(i));
System.out.print("=\"");
System.out.print(attrs.getValue(i));
System.out.print("\"");
}
System.out.print(">");
}
/** *//**
* 元素中字符数据事件:接收元素中字符数据
* 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外)
* 2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器
*/
public void characters(char[] ch, int start, int length) throws SAXException
{
System.out.print(new String(ch,start,length));
}
/** *//**
* 结束元素事件
*/
public void endElement(String uri, String localName, String qName) throws SAXException
{
System.out.print("</"+qName+">");
}
public static void main(String[] args)
{
SAXParserFactory spf=SAXParserFactory.newInstance();
try
{
SAXParser sp=spf.newSAXParser();
sp.parse(new File("db.xml"),new SAXPrinter());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}SAX解析实例二
org.xml.sax.ContentHandler接口: 通过实现该接口给出自己的解析实现。
org.xml.sax.ErrorHandler接口:如果SAX应用程序需要实现定制的错误处理,那么它必须实现这个接口,并调用XMLReader对象的setErrorHandler()方法向解析器注册异常处理实例,这样,解析器将通过这个接口报告所有的错误和警告。
ContentHandlerImpl.java
Java代码
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
public class ContentHandlerImpl implements ContentHandler
{
/** *//**
* 文档开始事件
*/
public void startDocument() throws SAXException
{
System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
}
/** *//**
* 接收处理指令事件
*/
public void processingInstruction(String target, String data) throws SAXException
{
System.out.println("<?"+target+" "+data+"?>");
}
/** *//**
* 元素开始事件
* 参数说明:
* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
* localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
* qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
* attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
*/
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException
{
System.out.print("<"+qName);//输出元素名称
int len=attrs.getLength();//元素属性列表长度
//利用循环输出属性列表
for(int i=0;i<len;i++)
{
System.out.print(" ");
System.out.print(attrs.getQName(i));
System.out.print("=\"");
System.out.print(attrs.getValue(i));
System.out.print("\"");
}
System.out.print(">");
}
/** *//**
* 元素中字符数据事件:接收元素中字符数据
* 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外)
* 2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器
*/
public void characters(char[] ch, int start, int length) throws SAXException
{
System.out.print(new String(ch,start,length));
}
/** *//**
* 结束元素事件
*/
public void endElement(String uri, String localName, String qName) throws SAXException
{
System.out.print("</"+qName+">");
}
public void endDocument() throws SAXException
{
}
public void endPrefixMapping(String prefix) throws SAXException
{
}
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException
{
}
public void setDocumentLocator(Locator locator)
{
}
public void skippedEntity(String name) throws SAXException
{
}
public void startPrefixMapping(String prefix, String uri) throws SAXException
{
}
}
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
public class ContentHandlerImpl implements ContentHandler
{
/** *//**
* 文档开始事件
*/
public void startDocument() throws SAXException
{
System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
}
/** *//**
* 接收处理指令事件
*/
public void processingInstruction(String target, String data) throws SAXException
{
System.out.println("<?"+target+" "+data+"?>");
}
/** *//**
* 元素开始事件
* 参数说明:
* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
* localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
* qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
* attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
*/
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException
{
System.out.print("<"+qName);//输出元素名称
int len=attrs.getLength();//元素属性列表长度
//利用循环输出属性列表
for(int i=0;i<len;i++)
{
System.out.print(" ");
System.out.print(attrs.getQName(i));
System.out.print("=\"");
System.out.print(attrs.getValue(i));
System.out.print("\"");
}
System.out.print(">");
}
/** *//**
* 元素中字符数据事件:接收元素中字符数据
* 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外)
* 2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器
*/
public void characters(char[] ch, int start, int length) throws SAXException
{
System.out.print(new String(ch,start,length));
}
/** *//**
* 结束元素事件
*/
public void endElement(String uri, String localName, String qName) throws SAXException
{
System.out.print("</"+qName+">");
}
public void endDocument() throws SAXException
{
}
public void endPrefixMapping(String prefix) throws SAXException
{
}
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException
{
}
public void setDocumentLocator(Locator locator)
{
}
public void skippedEntity(String name) throws SAXException
{
}
public void startPrefixMapping(String prefix, String uri) throws SAXException
{
}
} ErrorHandlerImpl.java
Java代码
public class ErrorHandlerImpl implements ErrorHandler
{
public void warning(SAXParseException e) throws SAXException
{
System.out.println("[Warning ]"+getLocationString(e)+":"+e.getMessage());
}
public void error(SAXParseException e) throws SAXException
{
System.out.println("[Error ]"+getLocationString(e)+":"+e.getMessage());
}
public void fatalError(SAXParseException e) throws SAXException
{
System.out.println("[Fatal Error ]"+getLocationString(e)+":"+e.getMessage());
}
private String getLocationString(SAXParseException e)
{
StringBuffer sb=new StringBuffer();
String publicId=e.getPublicId();
if(publicId!=null)
{
sb.append(publicId);
sb.append(" ");
}
String systemId=e.getSystemId();
if(systemId!=null)
{
sb.append(systemId);
sb.append(" ");
}
sb.append(e.getLineNumber());
sb.append(":");
sb.append(e.getColumnNumber());
return sb.toString();
}
}
public class ErrorHandlerImpl implements ErrorHandler
{
public void warning(SAXParseException e) throws SAXException
{
System.out.println("[Warning ]"+getLocationString(e)+":"+e.getMessage());
}
public void error(SAXParseException e) throws SAXException
{
System.out.println("[Error ]"+getLocationString(e)+":"+e.getMessage());
}
public void fatalError(SAXParseException e) throws SAXException
{
System.out.println("[Fatal Error ]"+getLocationString(e)+":"+e.getMessage());
}
private String getLocationString(SAXParseException e)
{
StringBuffer sb=new StringBuffer();
String publicId=e.getPublicId();
if(publicId!=null)
{
sb.append(publicId);
sb.append(" ");
}
String systemId=e.getSystemId();
if(systemId!=null)
{
sb.append(systemId);
sb.append(" ");
}
sb.append(e.getLineNumber());
sb.append(":");
sb.append(e.getColumnNumber());
return sb.toString();
}
}SaxParserTest.java
Java代码
import java.io.FileInputStream;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class SaxParserTest
{
public static void main(String[] args)
{
try
{
XMLReader xmlReader=XMLReaderFactory.createXMLReader();
//关闭或打开验证
xmlReader.setFeature("http://xml.org/sax/features/validation",true);
//注册事件处理器
xmlReader.setContentHandler(new ContentHandlerImpl());
//注册异常处理器
xmlReader.setErrorHandler(new ErrorHandlerImpl());
xmlReader.parse(new InputSource(new FileInputStream("saxdb.xml")));
} catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}
import java.io.FileInputStream;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class SaxParserTest
{
public static void main(String[] args)
{
try
{
XMLReader xmlReader=XMLReaderFactory.createXMLReader();
//关闭或打开验证
xmlReader.setFeature("http://xml.org/sax/features/validation",true);
//注册事件处理器
xmlReader.setContentHandler(new ContentHandlerImpl());
//注册异常处理器
xmlReader.setErrorHandler(new ErrorHandlerImpl());
xmlReader.parse(new InputSource(new FileInputStream("saxdb.xml")));
} catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}第二种:DOM解析
DOM中的核心概念就是节点。DOM在分析XML文档时,将将组成XML文档的各个部分(元素、属性、文本、注释、处理指令等)映射为一个对象(节点)。在内存中,这些节点形成一课文档树。整棵树是一个节点,树中的每一个节点也是一棵树(子树),可以说,DOM就是对这棵树的一个对象描述,我们通过访问树中的节点来存取XML文档的内容。
PS:属性节点是附属于元素的,不能被看做是元素的子节点,更不能作为一个单独的节点
DOMPrinter.java
Java代码
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import com.sun.org.apache.xerces.internal.parsers.DOMParser;
public class DOMPrinter
{
public static void main(String[] args)
{
try
{
/** *//** 获取Document对象 */
DOMParser parser = new DOMParser();
parser.parse("db.xml");
Document document = parser.getDocument();
printNode(document);
} catch (Exception e)
{
e.printStackTrace();
}
}
public static void printNode(Node node)
{
short nodeType=node.getNodeType();
switch(nodeType)
{
case Node.PROCESSING_INSTRUCTION_NODE://预处理指令类型
printNodeInfo(node);
break;
case Node.ELEMENT_NODE://元素节点类型
printNodeInfo(node);
printAttribute(node);
break;
case Node.TEXT_NODE://文本节点类型
printNodeInfo(node);
break;
default:
break;
}
Node child=node.getFirstChild();
while(child!=null)
{
printNode(child);
child=child.getNextSibling();
}
}
/** *//**
* 根据节点类型打印节点
* @param node
*/
public static void printNodeInfo(Node node)
{
if (node.getNodeType() == Node.ELEMENT_NODE)
{
System.out.println("NodeName: " + node.getNodeName());
}
else if (node.getNodeType() == Node.TEXT_NODE)
{
String value = node.getNodeValue().trim();
if (!value.equals(""))
System.out.println("NodeValue: " + value);
else
System.out.println();
}else
{
System.out.println(node.getNodeName()+" : "+node.getNodeValue());
}
}
/** *//**
* 打印节点属性
* @param aNode 节点
*/
public static void printAttribute(Node aNode)
{
NamedNodeMap attrs = aNode.getAttributes();
if(attrs!=null)
{
for (int i = 0; i < attrs.getLength(); i++)
{
Node attNode = attrs.item(i);
System.out.println("Attribute: " + attNode.getNodeName() + "=\"" + attNode.getNodeValue()+"\"");
}
}
}
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import com.sun.org.apache.xerces.internal.parsers.DOMParser;
public class DOMPrinter
{
public static void main(String[] args)
{
try
{
/** *//** 获取Document对象 */
DOMParser parser = new DOMParser();
parser.parse("db.xml");
Document document = parser.getDocument();
printNode(document);
} catch (Exception e)
{
e.printStackTrace();
}
}
public static void printNode(Node node)
{
short nodeType=node.getNodeType();
switch(nodeType)
{
case Node.PROCESSING_INSTRUCTION_NODE://预处理指令类型
printNodeInfo(node);
break;
case Node.ELEMENT_NODE://元素节点类型
printNodeInfo(node);
printAttribute(node);
break;
case Node.TEXT_NODE://文本节点类型
printNodeInfo(node);
break;
default:
break;
}
Node child=node.getFirstChild();
while(child!=null)
{
printNode(child);
child=child.getNextSibling();
}
}
/** *//**
* 根据节点类型打印节点
* @param node
*/
public static void printNodeInfo(Node node)
{
if (node.getNodeType() == Node.ELEMENT_NODE)
{
System.out.println("NodeName: " + node.getNodeName());
}
else if (node.getNodeType() == Node.TEXT_NODE)
{
String value = node.getNodeValue().trim();
if (!value.equals(""))
System.out.println("NodeValue: " + value);
else
System.out.println();
}else
{
System.out.println(node.getNodeName()+" : "+node.getNodeValue());
}
}
/** *//**
* 打印节点属性
* @param aNode 节点
*/
public static void printAttribute(Node aNode)
{
NamedNodeMap attrs = aNode.getAttributes();
if(attrs!=null)
{
for (int i = 0; i < attrs.getLength(); i++)
{
Node attNode = attrs.item(i);
System.out.println("Attribute: " + attNode.getNodeName() + "=\"" + attNode.getNodeValue()+"\"");
}
}
}DOM生成XML文档:DOMCreateExample.java
Java代码
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
public class DOMCreateExample
{
public static void main(String[] args) throws ParserConfigurationException
{
//DOMImplementation domImp = DOMImplementationImpl.getDOMImplementation();
DocumentBuilderFactory builderFact = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFact.newDocumentBuilder();
Document doc = builder.newDocument();
//Document doc = domImp.createDocument(null, null, null);
Element root = doc.createElement("games");
Element child1 = doc.createElement("game");
child1.appendChild(doc.createTextNode("Final Fantasy VII"));
child1.setAttribute("genre", "rpg");
root.appendChild(child1);
doc.appendChild(root);
XMLSerializer serial;
try
{
serial = new XMLSerializer(new FileOutputStream("domcreate.xml"), null);
serial.serialize(doc);
} catch (FileNotFoundException e1)
{
e1.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
public class DOMCreateExample
{
public static void main(String[] args) throws ParserConfigurationException
{
//DOMImplementation domImp = DOMImplementationImpl.getDOMImplementation();
DocumentBuilderFactory builderFact = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFact.newDocumentBuilder();
Document doc = builder.newDocument();
//Document doc = domImp.createDocument(null, null, null);
Element root = doc.createElement("games");
Element child1 = doc.createElement("game");
child1.appendChild(doc.createTextNode("Final Fantasy VII"));
child1.setAttribute("genre", "rpg");
root.appendChild(child1);
doc.appendChild(root);
XMLSerializer serial;
try
{
serial = new XMLSerializer(new FileOutputStream("domcreate.xml"), null);
serial.serialize(doc);
} catch (FileNotFoundException e1)
{
e1.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
}第三种JDOM解析
JDOM利用了java语言的优秀特性,极大地简化了对XML文档的处理,相比DOM简单易用。JDOM也使用对象树来表示XML文档,JDOM使用SAXj解析器来分析XML文档,构建JDOM树。然而JOMD本身并没有提供解析器,它使用其他开发商提供的标准SAX解析器,JDOM默认通过JAXP来选择解析器,可以通过手动知道解析器的类名来设置。
首先要在工程中添加jdom的jar包,这里使用jdom1.0.jar。(见附件)
JDOMConvert.java
Java代码
import java.io.File;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
public class JDOMConvert
{
public static void main(String[] args)
{
SAXBuilder saxBuilder=new SAXBuilder();
try
{
Document doc=saxBuilder.build(new File("domdb.xml"));
//首先创建好节点
Element eltDb=new Element("db");
Element eltDriver=new Element("driver");
Element eltUrl=new Element("url");
Element eltUser=new Element("user");
Element eltPassword=new Element("password");
//设置节点的值
eltDriver.setText("com.mysql.jdbc.Driver");
eltUrl.setText("jdbc:mysql://localhost/mySql");
eltUser.setText("root");
eltPassword.setText("xlc");
//添加到根节点
eltDb.addContent(eltDriver);
eltDb.addContent(eltUrl);
eltDb.addContent(eltUser);
eltDb.addContent(eltPassword);
//根节点设置属性
eltDb.setAttribute("type","mysql");
Element root=doc.getRootElement();
//root.removeChild("db");//删除节点
root.addContent(eltDb);//增加节点
//修改db节点中内容
root.getChild("db").getChild("user").setText("system");
root.getChild("db").getChild("password").setText("manager");
XMLOutputter xmlOut=new XMLOutputter();
//设置XML格式
Format fmt=Format.getPrettyFormat();
fmt.setIndent(" ");
fmt.setEncoding("utf-8");
xmlOut.setFormat(fmt);
xmlOut.output(doc,System.out);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
import java.io.File;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
public class JDOMConvert
{
public static void main(String[] args)
{
SAXBuilder saxBuilder=new SAXBuilder();
try
{
Document doc=saxBuilder.build(new File("domdb.xml"));
//首先创建好节点
Element eltDb=new Element("db");
Element eltDriver=new Element("driver");
Element eltUrl=new Element("url");
Element eltUser=new Element("user");
Element eltPassword=new Element("password");
//设置节点的值
eltDriver.setText("com.mysql.jdbc.Driver");
eltUrl.setText("jdbc:mysql://localhost/mySql");
eltUser.setText("root");
eltPassword.setText("xlc");
//添加到根节点
eltDb.addContent(eltDriver);
eltDb.addContent(eltUrl);
eltDb.addContent(eltUser);
eltDb.addContent(eltPassword);
//根节点设置属性
eltDb.setAttribute("type","mysql");
Element root=doc.getRootElement();
//root.removeChild("db");//删除节点
root.addContent(eltDb);//增加节点
//修改db节点中内容
root.getChild("db").getChild("user").setText("system");
root.getChild("db").getChild("password").setText("manager");
XMLOutputter xmlOut=new XMLOutputter();
//设置XML格式
Format fmt=Format.getPrettyFormat();
fmt.setIndent(" ");
fmt.setEncoding("utf-8");
xmlOut.setFormat(fmt);
xmlOut.output(doc,System.out);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}JDOM生成XML文档:JDOMCreate.java
Java代码
import java.io.IOException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
public class JDOMCreate
{
public static void main(String[] args)
{
Document doc = new Document(new Element("games"));
Element newGame = new Element("game").setText("Final Fantasy VI");
doc.getRootElement().addContent(newGame);
newGame.setAttribute("genre", "rpg");
XMLOutputter domstream = new XMLOutputter();
try
{
domstream.output(doc, System.out);
} catch (IOException e)
{
e.printStackTrace();
}
}
}
import java.io.IOException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
public class JDOMCreate
{
public static void main(String[] args)
{
Document doc = new Document(new Element("games"));
Element newGame = new Element("game").setText("Final Fantasy VI");
doc.getRootElement().addContent(newGame);
newGame.setAttribute("genre", "rpg");
XMLOutputter domstream = new XMLOutputter();
try
{
domstream.output(doc, System.out);
} catch (IOException e)
{
e.printStackTrace();
}
}
}第四种:DOM4J解析
dom4j与JDOM一样,也是一种用于解析XML文档的开放源代码的XML框架,dom4j也应用于java平台,dom4j API使用了java集合框架并完全支持DOM、SAX和JAXP。与JDOM不同的是,dom4j使用接口和抽象类,虽然dom4j的API相对复杂些,但它提供了比JDOM更好的灵活性。dom4j也使用SAX解析器来分析XML文档,创建dom4j树。此外dom4j也可以接收DOM格式的内容,并提供了从dom4j树到SAX事件流或W3C DOM树的输出机制。与JDOM不同,dom4j自带了一个SAX解析器Aelfred2,如果没有显示的设置SAX解析器,也没有通过系统属性org.xml.sax.driver设置解析器,dom3j将会使用JAXP来加载JAXP配置的解析器,如果创建解析器失败,那么最后才使用dom4j自带的Aelfred2解析器。
同样,首先要在工程中添加dom4j的jar包,这里使用dom4j-1.6.1.jar。(见附件)
Dom4j生成XML文档db.xml:Dom4jCreate.java
Java代码
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Dom4jCreate
{
public static void main(String[] args)
{
Document doc = DocumentHelper.createDocument();
doc.addProcessingInstruction("xml-stylesheet", "type='text/xsl' href='db.xsl'");
doc.addDocType("dbconfig", null,"db.dtd");
//Element root=DocumentHelper.createElement("dbconfig");
// doc.setRootElement(root);
Element root = doc.addElement("dbconfig");
Element eltDb= root.addElement("db");
Element eltDriver = eltDb.addElement("driver");
Element eltUrl = eltDb.addElement("url");
Element eltUser = eltDb.addElement("user");
Element eltPassword = eltDb.addElement("password");
eltDriver.setText("com.mysql.jdbc.Driver");
eltUrl.setText("jdbc:mysql://localhost/mySql");
eltUser.setText("root");
eltPassword.setText("xlc");
eltDb.addAttribute("type","mysql");
try
{
//设置输出格式
OutputFormat outFmt = new OutputFormat(" ", true);
outFmt.setEncoding("UTF-8");
/**//*PrintWriter pw = new PrintWriter(System.out);
doc.write(pw);
pw.flush();
pw.close();*/
XMLWriter xmlWriter = new XMLWriter(System.out, outFmt);
// XMLWriter xmlWriter=new XMLWriter(new FileWriter("db.xml"),outFmt);
xmlWriter.write(doc);
xmlWriter.flush();
xmlWriter.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Dom4jCreate
{
public static void main(String[] args)
{
Document doc = DocumentHelper.createDocument();
doc.addProcessingInstruction("xml-stylesheet", "type='text/xsl' href='db.xsl'");
doc.addDocType("dbconfig", null,"db.dtd");
//Element root=DocumentHelper.createElement("dbconfig");
// doc.setRootElement(root);
Element root = doc.addElement("dbconfig");
Element eltDb= root.addElement("db");
Element eltDriver = eltDb.addElement("driver");
Element eltUrl = eltDb.addElement("url");
Element eltUser = eltDb.addElement("user");
Element eltPassword = eltDb.addElement("password");
eltDriver.setText("com.mysql.jdbc.Driver");
eltUrl.setText("jdbc:mysql://localhost/mySql");
eltUser.setText("root");
eltPassword.setText("xlc");
eltDb.addAttribute("type","mysql");
try
{
//设置输出格式
OutputFormat outFmt = new OutputFormat(" ", true);
outFmt.setEncoding("UTF-8");
/**//*PrintWriter pw = new PrintWriter(System.out);
doc.write(pw);
pw.flush();
pw.close();*/
XMLWriter xmlWriter = new XMLWriter(System.out, outFmt);
// XMLWriter xmlWriter=new XMLWriter(new FileWriter("db.xml"),outFmt);
xmlWriter.write(doc);
xmlWriter.flush();
xmlWriter.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}Dom4j修改XML文档db.xml:Dom4jModify.java
Java代码
import java.io.File;
import java.io.FileWriter;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4jModify
{
public Document modifyDocument(File inputXml)
{
try
{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(inputXml);
document.addDocType("dbconfig",null,"db.dtd");
List list = document.content();
// Iterator iter = document.nodeIterator();
Iterator iter = list.iterator();
Element element = (Element) iter.next();
element.element("db").attribute("type").setValue("mysql");
element.element("db").element("url").setText("jdbc:mysql://localhost/mySql");
element.element("db").element("driver").setText("com.mysql.jdbc.Driver");
element.element("db").element("user").setText("root");
element.element("db").element("password").setText("xlc");
// 设置输出格式
OutputFormat outFmt = new OutputFormat(" ", true);
outFmt.setEncoding("UTF-8");
XMLWriter xmlWriter=new XMLWriter(new FileWriter("domdb-modified.xml"),outFmt);
xmlWriter.write(document);
xmlWriter.flush();
xmlWriter.close();
return document;
}
catch (Exception e)
{
System.out.println(e.getMessage());
return null;
}
}
public static void main(String[] args) throws Exception
{
Dom4jModify dom4jParser = new Dom4jModify();
Document document = dom4jParser.modifyDocument(new File("domdb.xml"));
OutputFormat outFmt = new OutputFormat(" ", true);
outFmt.setEncoding("UTF-8");
XMLWriter xmlWriter = new XMLWriter(System.out,outFmt);
xmlWriter.write(document);
xmlWriter.flush();
xmlWriter.close();
}
}
第一种:SAX解析
SAX处理机制:SAX是一种基于事件驱动的API。利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应,对传递的XML数据进行处理。
测试用的xml文件:db.xml
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<!--<!DOCTYPE dbconfig SYSTEM "db.dtd">-->
<dbconfig>
<db type="oracle">
<driver>oracle.jdbc.driver.OracleDriver</driver>
<url>jdbc:oracle:thin:@localhost:1521:oracle</url>
<user>scott</user>
<password>tiger</password>
</db>
</dbconfig>
<?xml version="1.0" encoding="UTF-8"?>
<!--<!DOCTYPE dbconfig SYSTEM "db.dtd">-->
<dbconfig>
<db type="oracle">
<driver>oracle.jdbc.driver.OracleDriver</driver>
<url>jdbc:oracle:thin:@localhost:1521:oracle</url>
<user>scott</user>
<password>tiger</password>
</db>
</dbconfig>DTD文件db.dtd
Xml代码
<!ELEMENT dbconfig (db+)>
<!ELEMENT db (driver,url,user,password)>
<!ELEMENT driver (#PCDATA)>
<!ELEMENT url (#PCDATA)>
<!ELEMENT user (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ATTLIST db type CDATA #REQUIRED>
<!ELEMENT dbconfig (db+)>
<!ELEMENT db (driver,url,user,password)>
<!ELEMENT driver (#PCDATA)>
<!ELEMENT url (#PCDATA)>
<!ELEMENT user (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ATTLIST db type CDATA #REQUIRED>SAX解析实例一
org.xml.sax.DefalutHandler类: 可以扩展该类,给出自己的解析实现
SAXPrinter.java
Java代码
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXPrinter extends DefaultHandler
{
/** *//**
* 文档开始事件
*/
public void startDocument() throws SAXException
{
System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
}
/** *//**
* 接收处理指令事件
*/
public void processingInstruction(String target, String data) throws SAXException
{
System.out.println("<?"+target+" "+data+"?>");
}
/** *//**
* 元素开始事件
* 参数说明:
* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
* localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
* qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
* attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
*/
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException
{
System.out.print("<"+qName);//输出元素名称
int len=attrs.getLength();//元素属性列表长度
//利用循环输出属性列表
for(int i=0;i<len;i++)
{
System.out.print(" ");
System.out.print(attrs.getQName(i));
System.out.print("=\"");
System.out.print(attrs.getValue(i));
System.out.print("\"");
}
System.out.print(">");
}
/** *//**
* 元素中字符数据事件:接收元素中字符数据
* 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外)
* 2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器
*/
public void characters(char[] ch, int start, int length) throws SAXException
{
System.out.print(new String(ch,start,length));
}
/** *//**
* 结束元素事件
*/
public void endElement(String uri, String localName, String qName) throws SAXException
{
System.out.print("</"+qName+">");
}
public static void main(String[] args)
{
SAXParserFactory spf=SAXParserFactory.newInstance();
try
{
SAXParser sp=spf.newSAXParser();
sp.parse(new File("db.xml"),new SAXPrinter());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXPrinter extends DefaultHandler
{
/** *//**
* 文档开始事件
*/
public void startDocument() throws SAXException
{
System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
}
/** *//**
* 接收处理指令事件
*/
public void processingInstruction(String target, String data) throws SAXException
{
System.out.println("<?"+target+" "+data+"?>");
}
/** *//**
* 元素开始事件
* 参数说明:
* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
* localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
* qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
* attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
*/
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException
{
System.out.print("<"+qName);//输出元素名称
int len=attrs.getLength();//元素属性列表长度
//利用循环输出属性列表
for(int i=0;i<len;i++)
{
System.out.print(" ");
System.out.print(attrs.getQName(i));
System.out.print("=\"");
System.out.print(attrs.getValue(i));
System.out.print("\"");
}
System.out.print(">");
}
/** *//**
* 元素中字符数据事件:接收元素中字符数据
* 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外)
* 2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器
*/
public void characters(char[] ch, int start, int length) throws SAXException
{
System.out.print(new String(ch,start,length));
}
/** *//**
* 结束元素事件
*/
public void endElement(String uri, String localName, String qName) throws SAXException
{
System.out.print("</"+qName+">");
}
public static void main(String[] args)
{
SAXParserFactory spf=SAXParserFactory.newInstance();
try
{
SAXParser sp=spf.newSAXParser();
sp.parse(new File("db.xml"),new SAXPrinter());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}SAX解析实例二
org.xml.sax.ContentHandler接口: 通过实现该接口给出自己的解析实现。
org.xml.sax.ErrorHandler接口:如果SAX应用程序需要实现定制的错误处理,那么它必须实现这个接口,并调用XMLReader对象的setErrorHandler()方法向解析器注册异常处理实例,这样,解析器将通过这个接口报告所有的错误和警告。
ContentHandlerImpl.java
Java代码
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
public class ContentHandlerImpl implements ContentHandler
{
/** *//**
* 文档开始事件
*/
public void startDocument() throws SAXException
{
System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
}
/** *//**
* 接收处理指令事件
*/
public void processingInstruction(String target, String data) throws SAXException
{
System.out.println("<?"+target+" "+data+"?>");
}
/** *//**
* 元素开始事件
* 参数说明:
* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
* localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
* qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
* attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
*/
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException
{
System.out.print("<"+qName);//输出元素名称
int len=attrs.getLength();//元素属性列表长度
//利用循环输出属性列表
for(int i=0;i<len;i++)
{
System.out.print(" ");
System.out.print(attrs.getQName(i));
System.out.print("=\"");
System.out.print(attrs.getValue(i));
System.out.print("\"");
}
System.out.print(">");
}
/** *//**
* 元素中字符数据事件:接收元素中字符数据
* 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外)
* 2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器
*/
public void characters(char[] ch, int start, int length) throws SAXException
{
System.out.print(new String(ch,start,length));
}
/** *//**
* 结束元素事件
*/
public void endElement(String uri, String localName, String qName) throws SAXException
{
System.out.print("</"+qName+">");
}
public void endDocument() throws SAXException
{
}
public void endPrefixMapping(String prefix) throws SAXException
{
}
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException
{
}
public void setDocumentLocator(Locator locator)
{
}
public void skippedEntity(String name) throws SAXException
{
}
public void startPrefixMapping(String prefix, String uri) throws SAXException
{
}
}
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
public class ContentHandlerImpl implements ContentHandler
{
/** *//**
* 文档开始事件
*/
public void startDocument() throws SAXException
{
System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
}
/** *//**
* 接收处理指令事件
*/
public void processingInstruction(String target, String data) throws SAXException
{
System.out.println("<?"+target+" "+data+"?>");
}
/** *//**
* 元素开始事件
* 参数说明:
* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
* localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
* qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
* attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
*/
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException
{
System.out.print("<"+qName);//输出元素名称
int len=attrs.getLength();//元素属性列表长度
//利用循环输出属性列表
for(int i=0;i<len;i++)
{
System.out.print(" ");
System.out.print(attrs.getQName(i));
System.out.print("=\"");
System.out.print(attrs.getValue(i));
System.out.print("\"");
}
System.out.print(">");
}
/** *//**
* 元素中字符数据事件:接收元素中字符数据
* 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外)
* 2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器
*/
public void characters(char[] ch, int start, int length) throws SAXException
{
System.out.print(new String(ch,start,length));
}
/** *//**
* 结束元素事件
*/
public void endElement(String uri, String localName, String qName) throws SAXException
{
System.out.print("</"+qName+">");
}
public void endDocument() throws SAXException
{
}
public void endPrefixMapping(String prefix) throws SAXException
{
}
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException
{
}
public void setDocumentLocator(Locator locator)
{
}
public void skippedEntity(String name) throws SAXException
{
}
public void startPrefixMapping(String prefix, String uri) throws SAXException
{
}
} ErrorHandlerImpl.java
Java代码
public class ErrorHandlerImpl implements ErrorHandler
{
public void warning(SAXParseException e) throws SAXException
{
System.out.println("[Warning ]"+getLocationString(e)+":"+e.getMessage());
}
public void error(SAXParseException e) throws SAXException
{
System.out.println("[Error ]"+getLocationString(e)+":"+e.getMessage());
}
public void fatalError(SAXParseException e) throws SAXException
{
System.out.println("[Fatal Error ]"+getLocationString(e)+":"+e.getMessage());
}
private String getLocationString(SAXParseException e)
{
StringBuffer sb=new StringBuffer();
String publicId=e.getPublicId();
if(publicId!=null)
{
sb.append(publicId);
sb.append(" ");
}
String systemId=e.getSystemId();
if(systemId!=null)
{
sb.append(systemId);
sb.append(" ");
}
sb.append(e.getLineNumber());
sb.append(":");
sb.append(e.getColumnNumber());
return sb.toString();
}
}
public class ErrorHandlerImpl implements ErrorHandler
{
public void warning(SAXParseException e) throws SAXException
{
System.out.println("[Warning ]"+getLocationString(e)+":"+e.getMessage());
}
public void error(SAXParseException e) throws SAXException
{
System.out.println("[Error ]"+getLocationString(e)+":"+e.getMessage());
}
public void fatalError(SAXParseException e) throws SAXException
{
System.out.println("[Fatal Error ]"+getLocationString(e)+":"+e.getMessage());
}
private String getLocationString(SAXParseException e)
{
StringBuffer sb=new StringBuffer();
String publicId=e.getPublicId();
if(publicId!=null)
{
sb.append(publicId);
sb.append(" ");
}
String systemId=e.getSystemId();
if(systemId!=null)
{
sb.append(systemId);
sb.append(" ");
}
sb.append(e.getLineNumber());
sb.append(":");
sb.append(e.getColumnNumber());
return sb.toString();
}
}SaxParserTest.java
Java代码
import java.io.FileInputStream;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class SaxParserTest
{
public static void main(String[] args)
{
try
{
XMLReader xmlReader=XMLReaderFactory.createXMLReader();
//关闭或打开验证
xmlReader.setFeature("http://xml.org/sax/features/validation",true);
//注册事件处理器
xmlReader.setContentHandler(new ContentHandlerImpl());
//注册异常处理器
xmlReader.setErrorHandler(new ErrorHandlerImpl());
xmlReader.parse(new InputSource(new FileInputStream("saxdb.xml")));
} catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}
import java.io.FileInputStream;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class SaxParserTest
{
public static void main(String[] args)
{
try
{
XMLReader xmlReader=XMLReaderFactory.createXMLReader();
//关闭或打开验证
xmlReader.setFeature("http://xml.org/sax/features/validation",true);
//注册事件处理器
xmlReader.setContentHandler(new ContentHandlerImpl());
//注册异常处理器
xmlReader.setErrorHandler(new ErrorHandlerImpl());
xmlReader.parse(new InputSource(new FileInputStream("saxdb.xml")));
} catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}第二种:DOM解析
DOM中的核心概念就是节点。DOM在分析XML文档时,将将组成XML文档的各个部分(元素、属性、文本、注释、处理指令等)映射为一个对象(节点)。在内存中,这些节点形成一课文档树。整棵树是一个节点,树中的每一个节点也是一棵树(子树),可以说,DOM就是对这棵树的一个对象描述,我们通过访问树中的节点来存取XML文档的内容。
PS:属性节点是附属于元素的,不能被看做是元素的子节点,更不能作为一个单独的节点
DOMPrinter.java
Java代码
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import com.sun.org.apache.xerces.internal.parsers.DOMParser;
public class DOMPrinter
{
public static void main(String[] args)
{
try
{
/** *//** 获取Document对象 */
DOMParser parser = new DOMParser();
parser.parse("db.xml");
Document document = parser.getDocument();
printNode(document);
} catch (Exception e)
{
e.printStackTrace();
}
}
public static void printNode(Node node)
{
short nodeType=node.getNodeType();
switch(nodeType)
{
case Node.PROCESSING_INSTRUCTION_NODE://预处理指令类型
printNodeInfo(node);
break;
case Node.ELEMENT_NODE://元素节点类型
printNodeInfo(node);
printAttribute(node);
break;
case Node.TEXT_NODE://文本节点类型
printNodeInfo(node);
break;
default:
break;
}
Node child=node.getFirstChild();
while(child!=null)
{
printNode(child);
child=child.getNextSibling();
}
}
/** *//**
* 根据节点类型打印节点
* @param node
*/
public static void printNodeInfo(Node node)
{
if (node.getNodeType() == Node.ELEMENT_NODE)
{
System.out.println("NodeName: " + node.getNodeName());
}
else if (node.getNodeType() == Node.TEXT_NODE)
{
String value = node.getNodeValue().trim();
if (!value.equals(""))
System.out.println("NodeValue: " + value);
else
System.out.println();
}else
{
System.out.println(node.getNodeName()+" : "+node.getNodeValue());
}
}
/** *//**
* 打印节点属性
* @param aNode 节点
*/
public static void printAttribute(Node aNode)
{
NamedNodeMap attrs = aNode.getAttributes();
if(attrs!=null)
{
for (int i = 0; i < attrs.getLength(); i++)
{
Node attNode = attrs.item(i);
System.out.println("Attribute: " + attNode.getNodeName() + "=\"" + attNode.getNodeValue()+"\"");
}
}
}
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import com.sun.org.apache.xerces.internal.parsers.DOMParser;
public class DOMPrinter
{
public static void main(String[] args)
{
try
{
/** *//** 获取Document对象 */
DOMParser parser = new DOMParser();
parser.parse("db.xml");
Document document = parser.getDocument();
printNode(document);
} catch (Exception e)
{
e.printStackTrace();
}
}
public static void printNode(Node node)
{
short nodeType=node.getNodeType();
switch(nodeType)
{
case Node.PROCESSING_INSTRUCTION_NODE://预处理指令类型
printNodeInfo(node);
break;
case Node.ELEMENT_NODE://元素节点类型
printNodeInfo(node);
printAttribute(node);
break;
case Node.TEXT_NODE://文本节点类型
printNodeInfo(node);
break;
default:
break;
}
Node child=node.getFirstChild();
while(child!=null)
{
printNode(child);
child=child.getNextSibling();
}
}
/** *//**
* 根据节点类型打印节点
* @param node
*/
public static void printNodeInfo(Node node)
{
if (node.getNodeType() == Node.ELEMENT_NODE)
{
System.out.println("NodeName: " + node.getNodeName());
}
else if (node.getNodeType() == Node.TEXT_NODE)
{
String value = node.getNodeValue().trim();
if (!value.equals(""))
System.out.println("NodeValue: " + value);
else
System.out.println();
}else
{
System.out.println(node.getNodeName()+" : "+node.getNodeValue());
}
}
/** *//**
* 打印节点属性
* @param aNode 节点
*/
public static void printAttribute(Node aNode)
{
NamedNodeMap attrs = aNode.getAttributes();
if(attrs!=null)
{
for (int i = 0; i < attrs.getLength(); i++)
{
Node attNode = attrs.item(i);
System.out.println("Attribute: " + attNode.getNodeName() + "=\"" + attNode.getNodeValue()+"\"");
}
}
}DOM生成XML文档:DOMCreateExample.java
Java代码
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
public class DOMCreateExample
{
public static void main(String[] args) throws ParserConfigurationException
{
//DOMImplementation domImp = DOMImplementationImpl.getDOMImplementation();
DocumentBuilderFactory builderFact = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFact.newDocumentBuilder();
Document doc = builder.newDocument();
//Document doc = domImp.createDocument(null, null, null);
Element root = doc.createElement("games");
Element child1 = doc.createElement("game");
child1.appendChild(doc.createTextNode("Final Fantasy VII"));
child1.setAttribute("genre", "rpg");
root.appendChild(child1);
doc.appendChild(root);
XMLSerializer serial;
try
{
serial = new XMLSerializer(new FileOutputStream("domcreate.xml"), null);
serial.serialize(doc);
} catch (FileNotFoundException e1)
{
e1.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
public class DOMCreateExample
{
public static void main(String[] args) throws ParserConfigurationException
{
//DOMImplementation domImp = DOMImplementationImpl.getDOMImplementation();
DocumentBuilderFactory builderFact = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFact.newDocumentBuilder();
Document doc = builder.newDocument();
//Document doc = domImp.createDocument(null, null, null);
Element root = doc.createElement("games");
Element child1 = doc.createElement("game");
child1.appendChild(doc.createTextNode("Final Fantasy VII"));
child1.setAttribute("genre", "rpg");
root.appendChild(child1);
doc.appendChild(root);
XMLSerializer serial;
try
{
serial = new XMLSerializer(new FileOutputStream("domcreate.xml"), null);
serial.serialize(doc);
} catch (FileNotFoundException e1)
{
e1.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
}第三种JDOM解析
JDOM利用了java语言的优秀特性,极大地简化了对XML文档的处理,相比DOM简单易用。JDOM也使用对象树来表示XML文档,JDOM使用SAXj解析器来分析XML文档,构建JDOM树。然而JOMD本身并没有提供解析器,它使用其他开发商提供的标准SAX解析器,JDOM默认通过JAXP来选择解析器,可以通过手动知道解析器的类名来设置。
首先要在工程中添加jdom的jar包,这里使用jdom1.0.jar。(见附件)
JDOMConvert.java
Java代码
import java.io.File;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
public class JDOMConvert
{
public static void main(String[] args)
{
SAXBuilder saxBuilder=new SAXBuilder();
try
{
Document doc=saxBuilder.build(new File("domdb.xml"));
//首先创建好节点
Element eltDb=new Element("db");
Element eltDriver=new Element("driver");
Element eltUrl=new Element("url");
Element eltUser=new Element("user");
Element eltPassword=new Element("password");
//设置节点的值
eltDriver.setText("com.mysql.jdbc.Driver");
eltUrl.setText("jdbc:mysql://localhost/mySql");
eltUser.setText("root");
eltPassword.setText("xlc");
//添加到根节点
eltDb.addContent(eltDriver);
eltDb.addContent(eltUrl);
eltDb.addContent(eltUser);
eltDb.addContent(eltPassword);
//根节点设置属性
eltDb.setAttribute("type","mysql");
Element root=doc.getRootElement();
//root.removeChild("db");//删除节点
root.addContent(eltDb);//增加节点
//修改db节点中内容
root.getChild("db").getChild("user").setText("system");
root.getChild("db").getChild("password").setText("manager");
XMLOutputter xmlOut=new XMLOutputter();
//设置XML格式
Format fmt=Format.getPrettyFormat();
fmt.setIndent(" ");
fmt.setEncoding("utf-8");
xmlOut.setFormat(fmt);
xmlOut.output(doc,System.out);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
import java.io.File;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
public class JDOMConvert
{
public static void main(String[] args)
{
SAXBuilder saxBuilder=new SAXBuilder();
try
{
Document doc=saxBuilder.build(new File("domdb.xml"));
//首先创建好节点
Element eltDb=new Element("db");
Element eltDriver=new Element("driver");
Element eltUrl=new Element("url");
Element eltUser=new Element("user");
Element eltPassword=new Element("password");
//设置节点的值
eltDriver.setText("com.mysql.jdbc.Driver");
eltUrl.setText("jdbc:mysql://localhost/mySql");
eltUser.setText("root");
eltPassword.setText("xlc");
//添加到根节点
eltDb.addContent(eltDriver);
eltDb.addContent(eltUrl);
eltDb.addContent(eltUser);
eltDb.addContent(eltPassword);
//根节点设置属性
eltDb.setAttribute("type","mysql");
Element root=doc.getRootElement();
//root.removeChild("db");//删除节点
root.addContent(eltDb);//增加节点
//修改db节点中内容
root.getChild("db").getChild("user").setText("system");
root.getChild("db").getChild("password").setText("manager");
XMLOutputter xmlOut=new XMLOutputter();
//设置XML格式
Format fmt=Format.getPrettyFormat();
fmt.setIndent(" ");
fmt.setEncoding("utf-8");
xmlOut.setFormat(fmt);
xmlOut.output(doc,System.out);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}JDOM生成XML文档:JDOMCreate.java
Java代码
import java.io.IOException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
public class JDOMCreate
{
public static void main(String[] args)
{
Document doc = new Document(new Element("games"));
Element newGame = new Element("game").setText("Final Fantasy VI");
doc.getRootElement().addContent(newGame);
newGame.setAttribute("genre", "rpg");
XMLOutputter domstream = new XMLOutputter();
try
{
domstream.output(doc, System.out);
} catch (IOException e)
{
e.printStackTrace();
}
}
}
import java.io.IOException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
public class JDOMCreate
{
public static void main(String[] args)
{
Document doc = new Document(new Element("games"));
Element newGame = new Element("game").setText("Final Fantasy VI");
doc.getRootElement().addContent(newGame);
newGame.setAttribute("genre", "rpg");
XMLOutputter domstream = new XMLOutputter();
try
{
domstream.output(doc, System.out);
} catch (IOException e)
{
e.printStackTrace();
}
}
}第四种:DOM4J解析
dom4j与JDOM一样,也是一种用于解析XML文档的开放源代码的XML框架,dom4j也应用于java平台,dom4j API使用了java集合框架并完全支持DOM、SAX和JAXP。与JDOM不同的是,dom4j使用接口和抽象类,虽然dom4j的API相对复杂些,但它提供了比JDOM更好的灵活性。dom4j也使用SAX解析器来分析XML文档,创建dom4j树。此外dom4j也可以接收DOM格式的内容,并提供了从dom4j树到SAX事件流或W3C DOM树的输出机制。与JDOM不同,dom4j自带了一个SAX解析器Aelfred2,如果没有显示的设置SAX解析器,也没有通过系统属性org.xml.sax.driver设置解析器,dom3j将会使用JAXP来加载JAXP配置的解析器,如果创建解析器失败,那么最后才使用dom4j自带的Aelfred2解析器。
同样,首先要在工程中添加dom4j的jar包,这里使用dom4j-1.6.1.jar。(见附件)
Dom4j生成XML文档db.xml:Dom4jCreate.java
Java代码
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Dom4jCreate
{
public static void main(String[] args)
{
Document doc = DocumentHelper.createDocument();
doc.addProcessingInstruction("xml-stylesheet", "type='text/xsl' href='db.xsl'");
doc.addDocType("dbconfig", null,"db.dtd");
//Element root=DocumentHelper.createElement("dbconfig");
// doc.setRootElement(root);
Element root = doc.addElement("dbconfig");
Element eltDb= root.addElement("db");
Element eltDriver = eltDb.addElement("driver");
Element eltUrl = eltDb.addElement("url");
Element eltUser = eltDb.addElement("user");
Element eltPassword = eltDb.addElement("password");
eltDriver.setText("com.mysql.jdbc.Driver");
eltUrl.setText("jdbc:mysql://localhost/mySql");
eltUser.setText("root");
eltPassword.setText("xlc");
eltDb.addAttribute("type","mysql");
try
{
//设置输出格式
OutputFormat outFmt = new OutputFormat(" ", true);
outFmt.setEncoding("UTF-8");
/**//*PrintWriter pw = new PrintWriter(System.out);
doc.write(pw);
pw.flush();
pw.close();*/
XMLWriter xmlWriter = new XMLWriter(System.out, outFmt);
// XMLWriter xmlWriter=new XMLWriter(new FileWriter("db.xml"),outFmt);
xmlWriter.write(doc);
xmlWriter.flush();
xmlWriter.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Dom4jCreate
{
public static void main(String[] args)
{
Document doc = DocumentHelper.createDocument();
doc.addProcessingInstruction("xml-stylesheet", "type='text/xsl' href='db.xsl'");
doc.addDocType("dbconfig", null,"db.dtd");
//Element root=DocumentHelper.createElement("dbconfig");
// doc.setRootElement(root);
Element root = doc.addElement("dbconfig");
Element eltDb= root.addElement("db");
Element eltDriver = eltDb.addElement("driver");
Element eltUrl = eltDb.addElement("url");
Element eltUser = eltDb.addElement("user");
Element eltPassword = eltDb.addElement("password");
eltDriver.setText("com.mysql.jdbc.Driver");
eltUrl.setText("jdbc:mysql://localhost/mySql");
eltUser.setText("root");
eltPassword.setText("xlc");
eltDb.addAttribute("type","mysql");
try
{
//设置输出格式
OutputFormat outFmt = new OutputFormat(" ", true);
outFmt.setEncoding("UTF-8");
/**//*PrintWriter pw = new PrintWriter(System.out);
doc.write(pw);
pw.flush();
pw.close();*/
XMLWriter xmlWriter = new XMLWriter(System.out, outFmt);
// XMLWriter xmlWriter=new XMLWriter(new FileWriter("db.xml"),outFmt);
xmlWriter.write(doc);
xmlWriter.flush();
xmlWriter.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}Dom4j修改XML文档db.xml:Dom4jModify.java
Java代码
import java.io.File;
import java.io.FileWriter;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4jModify
{
public Document modifyDocument(File inputXml)
{
try
{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(inputXml);
document.addDocType("dbconfig",null,"db.dtd");
List list = document.content();
// Iterator iter = document.nodeIterator();
Iterator iter = list.iterator();
Element element = (Element) iter.next();
element.element("db").attribute("type").setValue("mysql");
element.element("db").element("url").setText("jdbc:mysql://localhost/mySql");
element.element("db").element("driver").setText("com.mysql.jdbc.Driver");
element.element("db").element("user").setText("root");
element.element("db").element("password").setText("xlc");
// 设置输出格式
OutputFormat outFmt = new OutputFormat(" ", true);
outFmt.setEncoding("UTF-8");
XMLWriter xmlWriter=new XMLWriter(new FileWriter("domdb-modified.xml"),outFmt);
xmlWriter.write(document);
xmlWriter.flush();
xmlWriter.close();
return document;
}
catch (Exception e)
{
System.out.println(e.getMessage());
return null;
}
}
public static void main(String[] args) throws Exception
{
Dom4jModify dom4jParser = new Dom4jModify();
Document document = dom4jParser.modifyDocument(new File("domdb.xml"));
OutputFormat outFmt = new OutputFormat(" ", true);
outFmt.setEncoding("UTF-8");
XMLWriter xmlWriter = new XMLWriter(System.out,outFmt);
xmlWriter.write(document);
xmlWriter.flush();
xmlWriter.close();
}
}
发表评论
-
习惯的开发错误
2014-09-09 17:25 478在一个包的下面 创建一个test.java 文件 这样一个小 ... -
得到指定年份的所有周末
2014-08-20 18:18 1210/** * 得到指定年份的所有周末 */ publi ... -
对对字符串可能出现报空指针的小问题
2014-04-14 14:42 890今天很是郁闷啊,遇到一个基础的问题比对字符串的两种写法: ... -
Java 单例模式详解(转)
2014-03-26 16:52 831概念: java中单例 ... -
往文件里写入字符串
2014-01-20 13:52 1151package ab; import java.io.Bu ... -
Java数组,去掉重复值、增加、删除数组元素
2014-01-02 14:18 5172import java.util.List; import ... -
java定时器的使用(Timer)
2013-10-14 16:42 2446java定时器的使用(Timer) 2008-02-14 13 ... -
JSch - Java实现的SFTP(文件上传详解篇)(转)
2013-10-14 16:40 3445JSch是Java Secure Channel的缩写。JSc ... -
jvm
2013-09-30 15:03 775网上看到一位javaeye的同志写的文章,感觉总结的比较好,虽 ... -
sftp处理文件
2013-09-30 15:02 8110最近工作涉及sftp处理文件,写了个工具类,代码已经测试。请需 ... -
java BigDecimal的使用和四舍五入及格式规范(精准数据)
2013-06-17 15:37 21579• Java中的简单浮点数类型float和double不能够进 ... -
servlet拦截器代码
2013-03-29 13:45 22521- 实现Servlet.Filter接口 public cl ... -
session 超时的时间设置
2013-03-22 14:47 979为单个Web应用 配置超时时间可以在web.xml中使用< ... -
Calendar 获取日期
2013-01-23 10:44 1336Calendar 获取日期 如果想得到某个星期几是什么日期, ... -
JAVA帮助文档全系列
2013-01-05 11:02 0JAVA帮助文档全系列 JDK1.5 JDK1.6 JD ... -
Cannot create a server using the selected type
2012-08-27 11:02 0eclipse中安装tomcat服务器,报错" Ca ... -
线程池(jdk实现)
2012-07-10 15:01 0Sun在Java5中,对Java线程的类库做了大量的扩展,其中 ... -
遍历集合
2012-06-26 17:28 1075* * To change this template, c ... -
(转)Java 序列化
2012-06-26 14:55 1955当我们需要序列化一个J ... -
权限控制的发散性思维
2012-06-15 17:31 996权限控制的讨论 http://www.iteye.com ...
相关推荐
在Java中,处理XML文档通常有四种主要的解析方法:DOM(文档对象模型)、SAX(简单API对于XML)、JDOM(Java特定的DOM)以及DOM4J。每种解析方法都有自己的特点和适用场景,下面将详细介绍这些解析方法以及提供的...
在Java中,处理XML有四种主要的解析方式:DOM、SAX、DOM4J和JDOM。每种方法都有其特性和适用场景,下面将详细对比和介绍这四种解析方式。 1. DOM(Document Object Model) DOM是一种树形结构的API,它将整个XML...
在Java环境中,解析XML文档时,我们通常会遇到各种库,其中DOM4J是一个非常流行的、功能强大的开放源代码库。这个库不仅简化了XML处理,还提供了XPath和XSLT的支持,使其成为Java开发者处理XML的首选工具之一。 **...
**DOM4J 1.6.1 API及源代码中文版详解** DOM4J是一个非常优秀的Java XML API,它提供了全面而强大的XML处理功能,包括读取、创建、修改和查询XML文档。这个压缩包“dom4j-1.6.1-API+源代码-中文版.rar”包含了DOM4J...
2. **SAX支持**:DOM4J也支持SAX(Simple API for XML),这是一种事件驱动的解析器,适用于处理大型XML文件,因为它不需要将整个文档加载到内存中。 3. **XPath支持**:DOM4J提供了对XPath的支持,XPath是一种在...
本资源“xml四种解析.rar”聚焦于XML的四种主要解析方法,其中包括DOM、SAX、StAX以及DOM4J和JDOM这两个Java库的使用。 1. DOM(Document Object Model)解析: DOM是W3C推荐的标准解析模型,它将整个XML文档加载到...
本文将深入探讨如何使用dom4j和jdom两种流行的Java库来解析XML文档,并通过具体的代码示例来展示它们的应用。 ### DOM4J DOM4J(Document Object Model for Java)是一个开放源代码的Java API,用于处理XML文档。...
DOM4J和JDOM是两种流行的Java XML处理库,它们为开发者提供了API来解析、创建、操作和遍历XML文档。这两个库都是基于Java的,旨在简化XML文档对象模型(DOM)的使用,同时提供更高效和灵活的处理方式。 **DOM4J** ...
在源代码中,你可以找到使用DOM和SAX解析XML的示例。通过阅读和运行这些代码,你将更好地理解它们的工作原理和使用场景。记得在实际操作时,确保XML文件的编码正确,并处理可能的异常情况,如文件不存在或格式错误。...
DOM4J是一个功能丰富的XML处理库,它不仅实现了DOM API,还提供了SAX和StAX的集成。DOM4J的API设计更加简洁,易于理解和使用,特别是对于XPath表达式的支持,使得开发者可以方便地定位和操作XML文档的任何部分。 - ...
此外,Dom4j还支持SAX和DOM解析器,以及JAXB和JDOM的接口,使其能够与多种XML处理技术兼容。 **XML读取操作** 在Java中使用Dom4j进行XML读取通常包括以下步骤: 1. 加载XML文档:通过`DocumentFactory`创建`...
4. **Builder**:用于创建和解析XML文档的类,如`SAXBuilder`用于从XML源生成DOM结构,`DocumentBuilder`用于构建XML文档。 5. **BasicJDOMFactory**:提供默认的元素和属性创建方法。 **使用JDOM解析XML的步骤** ...
JDOM直接从XML源生成一个树模型,然后可以直接操作这个模型。 代码示例: ```java import org.jdom2.Document; import org.jdom2.input.SAXBuilder; import org.jdom2.output.Format; import org.jdom2.output....
与标准的DOM和SAX相比,jdom4j提供了更高级别的抽象,使得开发者可以更加专注于业务逻辑而不是底层的XML处理细节。此外,jdom4j还支持XPath查询,使得查找和操作XML文档中的特定元素变得非常容易。 ### 总结 通过...
1. **XML解析**:DOM4J可以使用DOM、SAX或StAX解析器读取XML文档,并提供了一种统一的API来处理不同解析器产生的事件。 2. **文档对象模型(DOM)**:DOM4J提供了类似于W3C DOM的接口,但比DOM更轻量级,性能更好。 ...
在本文中,我们将深入探讨JDOM的基本概念、如何读取和写入XML文件,并通过源代码分析来理解其工作原理。 1. JDOM基本概念: - DOM(Document Object Model)是W3C制定的一种标准,它定义了XML文档的结构和操作方法...
综上所述,dom4j-2.1.0是一个强大的XML处理库,提供了丰富的功能,包括解析、构建、查询、转换XML文档,并且提供了源代码和文档供开发者使用。在Java项目中,通过导入对应的JAR文件,可以方便地集成并利用dom4j进行...
通过JDOM,开发者可以使用Java API来处理XML文档,无需了解底层的SAX或DOM解析器的工作原理。 **JDOM的基本元素** - **Document**: XML文档的根节点,代表整个XML文档。 - **Element**: 表示XML文档中的元素,它是...
首先,我们要明白JDOM的核心理念是建立一个完全用Java实现的DOM(Document Object Model)接口,避免了使用其他跨平台的XML解析库如DOM4J或Xerces时可能遇到的平台依赖性问题。JDOM的设计目标是简单、高效和直接,...
- **解析和生成 XML**: DOM4J 可以解析 XML 文件,创建 `Document` 对象,也可以将 `Document` 转换回 XML 字符串。 - **操作 XML 结构**: 添加、删除、修改元素、属性等。 - **事件处理**: 提供了基于 SAX 的...