一、xml的解释技术:dom和sax
首先这两种标准并不是针对java的,在各种语言环境下都可以实现
dom:(Document Object Model)文档对象模型,是W3C组织推荐的处理XML的一种方式,dom是真正的国际标准。
sax:(Simple API for XML)不是官方标准,是事实的标准,几乎所有的XML解析器都支持它。不由任何商业组织维护,而是同一个非商业的组织在动作。
dom:实现的原理是把整个XML文档一次性读出,放在一个树形结构里,在需要的时候查找特定节点,然后对节点进行读与写。优点:实现简单,读写平衡 缺点:比较占内存。
sax:只在XML文档中查找特定条件的内容,并且只提取需要的内容,这样做占用内存小,灵活。缺点:他不能够写。
2、解析器:Crimson(SUN) Xerces(Apache) Aelfred2(dom4j)
开发工具包:jaxp Jdom dom4j
JAXP开发包是J2SE的一部分,它由java.xml org.23c.dom org.xml.sax包及其子包组成。
————编写java程序完成xml文档的解析—————通过dom完成xml的解析———
在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。
DocumentBuilder的对象是dom解析器,通过对应的工厂类创建。SAXParser的对象是sax解析器,通过对应的工厂类创建。DocumentBuilder的对象是dom解析器,通过对应的工厂类来创建。SAXParser的对象是sax解析器,通过对应的工厂类创建
创建解析器:调用DocumentBuilderFactory.newInstance()方法得到创建DOM 解析器的工厂。
DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
DocumentBuilder db=factory.newDocumentBuilder();
调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。通过parse()装载一个xml文档
Document doc=db.parse(DemoTest.class.getClassLoader().getResourceAsStream(“book.xml”));
或者直接db.parse(new File(src/book.xml));
xml文档里面所有的内容都会被当成Node(节点)类型来处理 Element元素节点 、Test文本节点、 Attr属性节点、。。。
Node节点类型定义了作为节点的共性。GetNodeName() 节点名称getNodeType()节点类型 getNodeValue()节点值
xml文档中的一个标签在解析中会被封装成一个对像,如果节点为元素对像则值为NULL(文档也一样),如果是一个文本节点,则值是此文本
解析后放在Document文档里,document也是一个节点
getChildNodes();得到的是节点,一个集合
package cn.csdn.dom;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DomTest {
public static void main(String[] args) throws Exception {
//(1)生成工厂类的对象
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//(2)生成解析器对象
DocumentBuilder db=factory.newDocumentBuilder();
//(3)对xml文档进行解析
Document doc=db.parse(new File("src/BOOK.xml"));
//(4)读取BOOK.xml文档中到底有几个节点?节点的名称、类型、值
//System.out.println(doc.getChildNodes().getLength());
//Node root=doc.getChildNodes().item(0);//找到根节点
//System.out.println(root.getNodeName()+" "+root.getNodeType()+" "+root.getNodeValue());//读取根
//findChildren(doc);//调用findChildren()方法
//findElementChildren(doc);//调用findElementChildren()方法
Node root=doc.getElementsByTagName("书架").item(0);
findFixedChild(root);//找第二个元素,输入
//findAttibutes(root);//属性的遍历
}
//-------------第一种--------------
/*public static void findChildren(Node node){
//先通过文档对象node得到根节点对象
Node root=node.getChildNodes().item(0);
//通过root对象得到根节点的所有儿子节点,返回一个节点的集合
NodeList list=root.getChildNodes();
System.out.println("根节点下的所有子节点的个数:"+list.getLength());
for(int i=0;i<list.getLength();i++){
Node n=list.item(i);
System.out.println(n.getNodeName()+" "+n.getNodeType()+" "+n.getNodeValue());
}*/
//-------------第二种--------------
public static void findChildren(Document doc){
//先通过文档对象node得到根节点对象
Node root=doc.getElementsByTagName("书架").item(0);
//通过root对象得到根节点的所有儿子节点,返回一个节点的集合
NodeList list=root.getChildNodes();
System.out.println("根节点下的所有子节点的个数:"+list.getLength());
for(int i=0;i<list.getLength();i++){
Node n=list.item(i);
System.out.println(n.getNodeName()+" "+n.getNodeType()+" "+n.getNodeValue());
}
}
//-------------方法findElementChildren()输出元素节点-----------
public static void findElementChildren(Document doc){
//先通过文档对象node得到根节点对象
Node root=doc.getElementsByTagName("书架").item(0);
//通过root对象得到根节点的所有儿子节点,返回一个节点的集合
NodeList list=root.getChildNodes();
//System.out.println("根节点下的所有子节点的个数:"+list.getLength());
int count=0;
for(int i=0;i<list.getLength();i++){
Node n=list.item(i);
if(n.getNodeType()==Node.ELEMENT_NODE)
System.out.println(n.getNodeName()+" "+n.getNodeType()+" "+n.getNodeValue());
count++;
}
System.out.println("元素节点的总数为:"+count);
}
//-----------------找第二个元素,输入---------------
public static void findFixedChild(Node node){
NodeList list=node.getChildNodes();//查找node节点的孩子
int count=0;
for(int i=0;i<list.getLength();i++){
boolean flag=false;
Node n1=list.item(i);
if(n1.getNodeName().equals("书")){
flag=true;
count++;
}
if(flag && count==2){
//该n1节点的所有孩子,输出即可
NodeList list1=n1.getChildNodes();
for(int j=0;j<list1.getLength();j++){
Node n=list1.item(j);
System.out.println(n.getNodeName()+" "+n.getNodeType()+" "+n.getNodeValue());
}
}
}
}
//-----------属性的遍历-----------
/*public static void findAttibutes(Node node){
NamedNodeMap map=node.getAttributes();
if(map!=null){
for(int i=0;i<map.getLength();i++){
Node d=map.item(i);
System.out.println(d.getNodeName()+" "+d.getNodeType()+" "+d.getNodeValue());
}
}
}*/
}