XML解析(DOM SAX JDOM DOM4J)

1 篇文章 0 订阅

  XML:可扩展标记语言,用于存储、传输数据(HTML用于显示数据)

4种解析:

1.DOM

用于平台语言无关的方式表达XML文档的官方W3C标准。

基于树。

2.SAX

类似于流媒体的优点,分析能够立即开始,而不是等待所有的数据被处理。。用于应用程序只能在读取数据时检查数据,因此不需要将数据存储在内存中,适用于大文档的的解析。

基于事件。


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;


import javax.naming.spi.DirStateFactory.Result;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAX extends DefaultHandler {
public static void main(String[] args) {
new SAX().readXML();
}

//读XML文档
public void readXML(){
SAXParserFactory spf=null;
FileInputStream fis=null;

try {
File file=new File(SAX.class.getClassLoader().getResource("").getPath()+"//student.xml");
fis=new FileInputStream(file);
spf=SAXParserFactory.newInstance();
SAXParser sp=spf.newSAXParser();
sp.parse(fis,new SAX());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}


@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("启动文档");


}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("结束文档");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
System.out.println("读取元素");


System.out.println(qName);
if(attributes.getValue("value")!=null){
System.out.println(attributes.getValue("value"));
}






}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
System.out.println("\\"+qName);
System.out.println("结束元素");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
System.out.println(new String(ch,start,length).trim());
}


}


3.JDOM

第一个JAVA特定文档模型,简化与XML的交互并且比使用DOM的实现更快。

与DOM的不同点:

使用具体类不适用接口;

API使用了大量的Collections类,方便JAVA开发者的使用。

import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.io.XMLWriter;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

public class JDOM {

//读取XML文件
public static void readXML(){
SAXBuilder sb=new SAXBuilder();
File file=new File(JDOM.class.getClassLoader().getResource("").getPath()+"student1.xml");
try {
Document doc=sb.build(file);
Element root=doc.getRootElement();
List<Element> slist=root.getChildren("student");
for(Element e:slist){
System.out.println(e.getAttributeValue("id"));
Element name=e.getChild("name");
System.out.println(name.getAttributeValue("value"));
Element address=e.getChild("address");
System.out.println(address.getAttributeValue("value"));
}

} catch (Exception e) {
// TODO: handle exception
}
}

//写XML文件
public static void writeXML(){
try {
File file=new File(JDOM.class.getClassLoader().getResource("").getPath()+"//student1.xml");
Element root=new Element("hrbust");
Element stu1=new Element("student"); 
stu1.setAttribute("id","01");
Element name1=new Element("name");
name1.setAttribute("value","Jack");
Element address1=new Element("address");
address1.setAttribute("value","北京");
       stu1.addContent(name1);
       stu1.addContent(address1);
       
       Element stu2=new Element("student");
       stu2.setAttribute("id","02");       
       Element name2=new Element("name");
       name2.setAttribute("value","Rose");
       Element address2=new Element("address");
       address2.setAttribute("value","上海");
       stu2.addContent(name2);
       stu2.addContent(address2);
       

       root.addContent(stu1);
       root.addContent(stu2);
 
       Document doc = new  Document(root);
       XMLOutputter writer=new XMLOutputter();
       writer.output(doc, new FileOutputStream(file));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}




}

4.DOM4J:

DOM4J使用接口、抽象类等方法,大量使用了Collections类。

应用于许多大型框架。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.List;


import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;


public class DOM4J {


//读XML文件
public void readXML(){

InputStream fis=DOM4J.class.getClassLoader().getSystemResourceAsStream("student.xml");

try {

BufferedReader reader=new BufferedReader(new InputStreamReader(fis,"utf-8"));
String line=null;
StringBuffer sb=new StringBuffer();
while((line=reader.readLine())!=null){
sb.append(line.trim());
}
Element root=DocumentHelper.parseText(sb.toString()).getRootElement();
List<Element> slist=root.elements("student");
for(Element stu:slist){
Element name=stu.element("name");
Element address=stu.element("address");
System.out.println(stu.attributeValue("id"));
System.out.println(name.attributeValue("value"));
System.out.println(address.attributeValue("value"));
}

} catch (Exception e) {
// TODO: handle exception
}
}
//写XML文件
public void writeXML( ){
FileOutputStream fos=null;
try {
String path=DOM4J.class.getClassLoader().getResource("").getPath();
System.out.println(path);
File file=new File(path+"//student.xml");
fos=new FileOutputStream(file);
OutputFormat of=OutputFormat.createPrettyPrint();
of.setEncoding("utf-8");
of.setIndentSize(4);
XMLWriter writer=new XMLWriter(fos,of);
Document doc = DocumentHelper.createDocument();
Element root=doc.addElement("hrbust");

Element node=root.addElement("student");

node.addAttribute("id","01");
Element name1=node.addElement("name");
name1.addAttribute("value", "Jack");
Element address1=node.addElement("address");
address1.addAttribute("value", "北京");

node=root.addElement("student");
node.addAttribute("id","02");
Element name2=node.addElement("name");
name2.addAttribute("value", "Rose");
Element address2=node.addElement("address");
address2.addAttribute("value", "哈尔滨");

writer.write(doc);
writer.flush();
writer.close();
fos.flush();
fos.close();


} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
}
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值