xml (extensible markup language) 意为可扩展标记语言,被多数技术人员用以选择作为数据传输的载体,成为一种通用的数据交换格式,xml的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的便利。在不同的语言中,解析mxl的方式都是一样的,只不过实现的语法不同而已。众所周知,现在解析xml的方法越来越多,但主流的方法也就四种,即:dom、sax、jdom和dom4j。
这四种方法的jar包下载地址:
①dom:在现在的java jdk里都自带了,在xml-apis.jar包里
②sax:http://sourceforge.net/projects/sax/
③jdom:http://jdom.org/downloads/index.html
④dom4j:http://sourceforge.net/projects/dom4j/
下面以一个实例来具体说明这4种方法:
xml文件:
<?xml version="1.0" encoding="gb2312"?>
<result>
<value>
<no>a1234</no>
<addr>四川省xx县xx镇xx路x段xx号</addr>
</value>
<value>
<no>b1234</no>
<addr>四川省xx市xx乡xx村xx组</addr>
</value>
</result>
实现方法:
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class myxmlreader{
public static void main(string arge[]){
long lasting =system.currenttimemillis();
try{
file f=new file("data_10k.xml");
documentbuilderfactory factory=documentbuilderfactory.newinstance();
documentbuilder builder=factory.newdocumentbuilder();
document doc = builder.parse(f);
nodelist nl = doc.getelementsbytagname("value");
for (int i=0;i<nl.getlength();i++){
system.out.print("车牌号码:" + doc.getelementsbytagname("no").item(i).getfirstchild().getnodevalue());
system.out.println("车主地址:" + doc.getelementsbytagname("addr").item(i).getfirstchild().getnodevalue());
}
}catch(exception e){
e.printstacktrace();
}
【优点】
【缺点】
通常需要加载整个xml文档来构造层次结构,消耗资源大。
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class myxmlreader extends defaulthandler {
java.util.stack tags = new java.util.stack();
public myxmlreader() {
super();
}
public static void main(string args[]) {
long lasting = system.currenttimemillis();
try {
saxparserfactory sf = saxparserfactory.newinstance();
saxparser sp = sf.newsaxparser();
myxmlreader reader = new myxmlreader();
sp.parse(new inputsource("data_10k.xml"), reader);
} catch (exception e) {
e.printstacktrace();
}
system.out.println("运行时间:" + (system.currenttimemillis() - lasting) + "毫秒");}
public void characters(char ch[], int start, int length) throws saxexception {
string tag = (string) tags.peek();
if (tag.equals("no")) {
system.out.print("车牌号码:" + new string(ch, start, length));
}
if (tag.equals("addr")) {
system.out.println("地址:" + new string(ch, start, length));
}
}
public void startelement(string uri,string localname,string qname,attributes attrs) {
tags.push(qname);}
}
【优点】import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
public class myxmlreader {
public static void main(string arge[]) {
long lasting = system.currenttimemillis();
try {
saxbuilder builder = new saxbuilder();
document doc = builder.build(new file("data_10k.xml"));
element foo = doc.getrootelement();
list allchildren = foo.getchildren();
for(int i=0;i<allchildren.size();i++) {
system.out.print("车牌号码:" + ((element)allchildren.get(i)).getchild("no").gettext());
system.out.println("车主地址:" + ((element)allchildren.get(i)).getchild("addr").gettext());
}
} catch (exception e) {
e.printstacktrace();
}
}
【优点】import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
public class myxmlreader {
public static void main(string arge[]) {
long lasting = system.currenttimemillis();
try {
file f = new file("data_10k.xml");
saxreader reader = new saxreader();
document doc = reader.read(f);
element root = doc.getrootelement();
element foo;
for (iterator i = root.elementiterator("value"); i.hasnext() {
foo = (element) i.next();
system.out.print("车牌号码:" + foo.elementtext("no"));
system.out.println("车主地址:" + foo.elementtext("addr"));
}
} catch (exception e) {
e.printstacktrace();
}
)
【优点】documentbuilderfactory
dbf=documentbuilderfactory.newinstance(); dbf.setignoringelementcontentwhitespace(true);
documentbuilder db = dbf.newdocumentbuilder();
document doc = db.parse(xmlpath); // 使用dom解析xml文件
nodelist sonlist = doc.getelementsbytagname("son");
for (int i = 0; i < sonlist.getlength(); i++) // 循环处理对象
{
element son = (element)sonlist.item(i);;
for (node node = son.getfirstchild(); node != null; node = node.getnextsibling()){
if (node.getnodetype() == node.element_node){
string name = node.getnodename();
string value = node.getfirstchild().getnodevalue();
system.out.println(name+" : "+value);
}
}
}
public static void getfamilymemebers(){
documentbuilderfactory dbf=documentbuilderfactory.newinstance();
dbf.setignoringelementcontentwhitespace(true);
try {
documentbuilder db = dbf.newdocumentbuilder();
document doc = db.parse(xmlpath); // 使用dom解析xml文件
nodelist sonlist = doc.getelementsbytagname("son");
for (int i = 0; i < sonlist.getlength(); i++) // 循环处理对象
{
element son = (element)sonlist.item(i);;
for (node node = son.getfirstchild(); node != null; node = node.getnextsibling()){
if (node.getnodetype() == node.element_node){
string name = node.getnodename();
string value = node.getfirstchild().getnodevalue();
system.out.println(name+" : "+value);
}
}
}
} catch (exception e) {
e.printstacktrace();
}
}
element root = xmldoc.getdocumentelement();
//删除指定节点
element son =xmldoc.createelement("son");
son.setattribute("id", "004");
element name = xmldoc.createelement("name");
name.settextcontent("小儿子");
son.appendchild(name);
element age = xmldoc.createelement("name");
age.settextcontent("0");
son.appendchild(age);
root.appendchild(son);
transformerfactory factory = transformerfactory.newinstance();
transformer former = factory.newtransformer();
former.transform(new domsource(xmldoc), new streamresult(new file(xmlpath)));
public static void createson() {
documentbuilderfactory dbf=documentbuilderfactory.newinstance();
dbf.setignoringelementcontentwhitespace(false);
try{
documentbuilder db=dbf.newdocumentbuilder();
document xmldoc=db.parse(xmlpath);
element root = xmldoc.getdocumentelement();
//删除指定节点
element son =xmldoc.createelement("son");
son.setattribute("id", "004");
element name = xmldoc.createelement("name");
name.settextcontent("小儿子");
son.appendchild(name);
element age = xmldoc.createelement("name");
age.settextcontent("0");
son.appendchild(age);
root.appendchild(son);
//保存
transformerfactory factory = transformerfactory.newinstance();
transformer former = factory.newtransformer();
former.transform(new domsource(xmldoc), new streamresult(new file(xmlpath)));
}catch(exception e){
e.printstacktrace();
}
}
public static node selectsinglenode(string express, element source) {
node result=null;
xpathfactory xpathfactory=xpathfactory.newinstance();
xpath xpath=xpathfactory.newxpath();
try {
result=(node) xpath.evaluate(express, source, xpathconstants.node);
} catch (xpathexpressionexception e) {
e.printstacktrace();
}
return result;
}
element root = xmldoc.getdocumentelement();
element per =(element) selectsinglenode("/father/son[@id='001']", root);
per.getelementsbytagname("age").item(0).settextcontent("27");
transformerfactory factory = transformerfactory.newinstance();
transformer former = factory.newtransformer();
former.transform(new domsource(xmldoc), new streamresult(new file(xmlpath)));
public static void modifyson(){
documentbuilderfactory dbf=documentbuilderfactory.newinstance();
dbf.setignoringelementcontentwhitespace(true);
try{
documentbuilder db=dbf.newdocumentbuilder();
document xmldoc=db.parse(xmlpath);
element root = xmldoc.getdocumentelement();
element per =(element) selectsinglenode("/father/son[@id='001']", root);
per.getelementsbytagname("age").item(0).settextcontent("27");
transformerfactory factory = transformerfactory.newinstance();
transformer former = factory.newtransformer();
former.transform(new domsource(xmldoc), new streamresult(new file(xmlpath)));
}catch(exception e){
e.printstacktrace();
}
}
element root = xmldoc.getdocumentelement();
element son =(element) selectsinglenode("/father/son[@id='002']", root);
root.removechild(son);
transformerfactory factory = transformerfactory.newinstance();
transformer former = factory.newtransformer();
former.transform(new domsource(xmldoc), new streamresult(new file(xmlpath)));
public static void discardson(){
documentbuilderfactory dbf=documentbuilderfactory.newinstance();
dbf.setignoringelementcontentwhitespace(true);
try{
documentbuilder db=dbf.newdocumentbuilder();
document xmldoc=db.parse(xmlpath);
element root = xmldoc.getdocumentelement();
element son =(element) selectsinglenode("/father/son[@id='002']", root);
root.removechild(son);
transformerfactory factory = transformerfactory.newinstance();
transformer former = factory.newtransformer();
former.transform(new domsource(xmldoc), new streamresult(new file(xmlpath)));
}catch(exception e){
e.printstacktrace();
}
}