XML简介
优点:
1.XML文档的内容和结构完全分离
2.数据交换,可以利用xml在不同的语言,不同的系统之间进行数据交换
3.可扩展性。
4.配置。使用XML配制文件的应用程序能够方便地处理所需数据,不用象其他应用那样要经过重新编译才能修改和维护应用系统。
缺点:
1.在处理大量数据的时候效率低下。
2.定义繁琐,需要定义dtd,传输数据时还要加上很多结构化、规范化的冗余信息,相比起直接发接发送一串二进制数来讲,效率自然低了
xsl
XSL是指可扩展样式表语言 (EXtensible Stylesheet Language),是一种用于以可读格式呈现 XML 数据的语言。
就比如css相对于html一样,定义xml的展现方式
DTD
定义xml文件的规则。文件名以*.dtd结尾
schema
和dtd差不多,都是用来定义xml格式的。文件名以*.xsd结尾。本身就是xml文件,设计schema可以用XMLSpy这个工具
XML解析方式:
1.DOM——面向模型的。一次性把文件读到内存里,形成一颗DOM树,从内存中读取数据,适合比较小的文件
2.SAX——面向事件的,读一部分写一部分,流程性分析,比较适合大型的文件
DOM解析代码: package com.xmlParse; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class DOMParse { public void parse(InputStream in) throws Exception{ //创建一个文档解析工厂实例 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //根据解析工厂创建一个解析器 DocumentBuilder db = dbf.newDocumentBuilder(); //将解析器将文件流转换为文档对象 Document doc = db.parse(in); //根据文档对象查找到 XML的根节点 Element root = doc.getDocumentElement(); //用循环将所的节点打印出来 for(Node node=root.getFirstChild();node!=null;node=root.getNextSibling()){ System.out.println("[节点名称:"+node.getNodeName()+",节点类型:"+node.getNodeType()+"]"); } //获取以student标记的所有节点元素 NodeList nlist = doc.getElementsByTagName("student"); for(int i=0;i<nlist.getLength();i++){ Element e = (Element)nlist.item(i); System.out.println("学号:"+e.getAttribute("id")+",姓名:"+e.getAttribute("name")); } //承机访问节点元素 Element stu=doc.getElementById("s001"); System.out.println("学号:"+stu.getAttribute("id")+",姓名:"+stu.getAttribute("name")); } public static void main(String[] args) { DOMParse dp = new DOMParse(); try { dp.parse(DOMParse.class.getResourceAsStream("../lxit.xml")); } catch (Exception e) { e.printStackTrace(); System.out.println("错误消息:"+e.getMessage()); } } }
2.SAX解析
1.实现类 package sax; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class EventParse extends DefaultHandler{ public EventParse() { super(); } //载入文档时回调些函数 public void startDocument() throws SAXException { } //当标签中有内容时,回调函数 public void characters(char[] ch, int start, int length) throws SAXException { } //当文档解析结束时,回调此函数 public void endDocument() throws SAXException { } //开始解析标记元素时,回调些函数 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { } } 2.解析类 package sax; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class TestEventParse { public static void main(String[] args) { // TODO Auto-generated method stub try{ //创建SAX 解析工厂实例 SAXParserFactory spf = SAXParserFactory.newInstance(); //得到SAX解析器 SAXParser sp = spf.newSAXParser(); //创建事件实例 EventParse ep = new EventParse(); //开始解析 sp.parse(TestEventParse.class.getResourceAsStream("student.xml"), ep); }catch(Exception ex){ System.out.println("解析出错:"+ex.getMessage()); } } }
3.dom4j解析(SAX方式)
import java.io.InputStream; import java.util.List; import org.dom4j.Document; import org.dom4j.Node; import org.dom4j.io.SAXReader; public class Dom4jParse { public void parse(InputStream in) throws Exception { // 首先创建Dom4j的解析器 SAXReader sp = new SAXReader(true); // 通过saxreader 的parse 方法,将文件流转换为 文档模型 Document doc = sp.read(in); // 得到文档对象的根节点 Node root = doc.getRootElement(); // 选择结点进行解析 List nodes = root.selectNodes("/class/student"); for (Object o : nodes) { Node t = (Node) o; System.out.print("学生编号:" + t.selectSingleNode("@no").getText() + ",学生名称:" + t.selectSingleNode("@name").getText() + ",中间文本:" + t.getText() + "\n"); } } public static void main(String[] args) { Dom4jParse dp = new Dom4jParse(); try { dp.parse(Dom4jParse.class.getResourceAsStream("student.xml")); } catch (Exception e) { e.printStackTrace(); } } }
4.jdom解析(DOM方式)
import org.jdom.input.*; import org.jdom.Attribute; import org.jdom.Element; import org.xml.sax.SAXException; import java.io.*; import java.util.List; import org.apache.xerces.parsers.*; public class JDomDOM { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub DOMBuilder builder = new DOMBuilder(); DOMParser parser = new DOMParser(); String path = "D:\\student.xml"; String output = ""; try { parser.parse(path); org.w3c.dom.Document domDocument = parser.getDocument(); org.jdom.Document jdomDocument = builder.build(domDocument); Element root = jdomDocument.getRootElement(); output += "This XML document's root node is: " + root.getName() + "\r\n"; List <Element> children = root.getChildren(); output += "The root has " + children.size() + " subNodes \r\n"; for(int i = 0; i < children.size(); i++){ Element node = children.get(i); output += "In the " + i + 1 + node.getName() + "subNode: \r\n"; List <Attribute> attrs = node.getAttributes(); for(int k = 0; k < attrs.size(); k++){ Attribute attr = attrs.get(k); output += "The " + k + 1 + "attribute is " + attr.getName(); output += " the value is: " + attr.getValue() + "\r\n"; } List <Element> childrenList = node.getChildren(); for(int j = 0; j < childrenList.size(); j++){ Element childNode = childrenList.get(j); output += "The " + j + 1 + "subNode is: " + childNode.getName(); output += " value is " + childNode.getValue() + "\r\n"; } } System.out.println(output); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }