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{
}
}
}