十六XML

EXtensible Markup Language

1.xml和html

XML 用来存储和交换数据

支持自定义标签,可扩展性,区分大小写

且里面的标签都是成对的

THML 用来显示数据

标签都有固定含义,不能去创造新的标签,不区分大小写

2.xml组成

1.前导区

规定了XML页面的3个属性

version:表示使用的XML版本

enconding:页面使用的文字编码

standalone:此XML文件是否独立运行

例:<?xml " version=“1.0” " encoding=“UTF-8” ?>

2.数据区

所有元素都必须有根元素,一个根元素可存放多个子元素,但要求每一个元素必须完结,且区分大小写

也可加入对应的特殊符 例:&amp; & &gt; > &lt; < &quot; " &apos ’

CDATA标记不会进行解析,原封不动将原数据传递给应用程序 例:<![CDATA[内容是不进行解析,原样子显示]]>

3.优点

独立性(独立于操作系统,编程语言)

灵活性

可扩展性

可交互

4.XML的解析
1.DOM解析

将XML文档转换为对象模型的集合即DOM树

DOM解析步骤:1.创建解析器工厂对象

2.由解析器工厂对象创建解析器对象

3.由解析器对象对指定XML文件进行解析,构建相应的DOM树,创建Document对象

4.以Document对象为起点对DOM树的节点进行增删改查操作

核心类

1.Document

代表整个 XML 文档,表示 DOM 树的根,提供了对文档中的数据进行访问和操作的入口,Document 节点可以访问 XML 文件中所有的元素内容

Document 的常用方法有:
getElementsByTagName(String):返回一个 NodeList 对象,它包含了所有给定标签名字的标签
getDocumentElement():返回一个代表这个 DOM 树的根节点的 Element 对象,也就是代表 XML 文档根元 素的那个对象

2.Node

此接口在整个 DOM 树中具有举足轻重的地位,DOM 操作的核心接口中有很大一部分接是从 Node 接口继承过来的。例如:Document、Element、Attri等接口,每一个 Node 接口代表了 DOM 树中的一个节点

NodeList 的常用方法有:
getLength():返回列表的长度
item(int):返回指定位置的 Node 对象

3.NodeList

此接口表示的是一个节点的集合,一般用于表示有顺序关系的一组节点,例如:一个节点的子节点,当文档改变的时候会直接影响到 NodeList 集

Node 对象的主要方法有:
getChildNodes() 包含此节点的所有子节点的 NodeList
getFirstChild() 如果节点存在子节点,则返回第一个子节点
getLastChild() 如果节点存在子节点,返回最后一个子节点
getNextSibling() 返回在 DOM 树中这个节点的下一个兄弟节点
getPreviousSibling() 返回在 DOM 树中这个节点的上一个兄弟节点
getNodeName() 根据节点的类型返回节点的名称
getNodeValue() 返回节点的值
getNodeType() 返回节点的类型

4.NamedNodeMap

此接口表示的是一组节点和其唯一名字对应的一一对应关系,本接口主要用于属性节点的表示上

5.Element

代表 XML 文档中的标签元素
继承自 Node 对象最主要的子对象

Element 对象的方法:
getAttribute(String):返回标签中给定属性名称的属性的值
getElementsByTagName(String):返回具有给定标记名称的所有后代 Elements的 NodeList

public class S1DOMXML {

	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		File f=new File("xmldom.xml");
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();//1.创建解析器工厂对象
		DocumentBuilder db=dbf.newDocumentBuilder();//2.由工厂解析器对象创建解析器对象
		Document d=db.parse(f);//3.由解析器对象对指定的xml文件进行解析,构建相应的DOM树,创建Document对象
		NodeList nl=d.getElementsByTagName("VALUE");//3.取得DOM树的节点值
		System.out.println(nl.getLength());
		for(int i=0;i<nl.getLength();i++){		System.out.println(d.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());		System.out.println(d.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
		}		
	}
}

2
A1234
airport NCS
B1234
seagate llc
2.jDOM解析

是java语言编写易于读、写、操作XML的一套组件

jDOM解析步骤:1.建立解析器对象

2.将XML文档解析为DOM树

3.取得树的根节点元素

4.取得节点下的所有孩子节点

5.对集合元素进行遍历

public class T03JDOM {
	public static void main(String[] args) throws JDOMException, IOException {
		SAXBuilder SAXB=new SAXBuilder();//1.创建解析器对象
		Document d=SAXB.build(new File("xmldom.xml"));//2.将XML文档转换为DOM树
		Element foo=d.getRootElement();//3.取得树的根节点元素
		List allChildren=foo.getChildren();//4.取得根节点下所有孩子节点
		for(int i=0;i<allChildren.size();i++){//5.对集合元素进行遍历
			System.out.println(((Element) allChildren.get(i)).getChild("NO").getText());
			System.out.println(((Element) allChildren.get(i)).getChild("ADDR").getText());
		}	
	}
}
3.Dom4j解析

一组XML操作的组件包,主要用来读写XML文件,由于DOM4J性能优异、功能强大,易用性等特点被广泛应用开

例:Hibernate,Spring框架中使用了DOM4j进行XML解析

DOM4j解析步骤:1.得到解析器

2.通过解析器解析XML文件得到Document对象

3.得到DOM树的根节点

4.使用迭代器来遍历节点

public class T04DOM4J {
	public static void main(String[] args) throws DocumentException {
		// TODO Auto-generated method stub
		File f=new File("xmldom.xml");
		SAXReader reader=new SAXReader();//1.得到解析器
		Document d=reader.read(f);//2.通过解析器解析XML文件得到Document对象
		Element root=d.getRootElement();//3.得到DOM树的根节点
		Iterator<Element> it=root.elementIterator();//4.使用迭代器来遍历节点
		while(it.hasNext()){
			Element e=it.next();
			System.out.println(e.elementText("NO"));
			System.out.println(e.elementText("ADDR"));
		}	
	}
}
4.SAX解析

在读取文档是激活一系列事件,推给事件处理器,由处理器完成对文档内容的访问

优点:内存消耗下

无需为所有节点创建对象

public class T02SAXDOM extends DefaultHandler{
	Stack t=new Stack();
	
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String ts=(String) t.peek();// //取出栈顶元素
		if(ts.equals("NO")){
			System.out.println(new String(ch,start,length));
		}
		if(ts.equals("ADDR")){
			System.out.println(new String(ch,start,length));
		}
	}
	public void startElement(String uri, String localName, String
			qName,Attributes attrs) {
			t.push(qName);  //进栈
			}
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException{
		SAXParserFactory SAXpf=SAXParserFactory.newInstance();
		SAXParser SAXP=SAXpf.newSAXParser();
		T02SAXDOM tReader=new T02SAXDOM();
		SAXP.parse(new InputSource("xmldom.xml"), tReader);
		
	}
}