XML解析方式:sax,dom.
这两种标准并不是针对Java的,他们在各种语言环境下都可以实现
dom(Document Object Model,即文档对象模型),是真正的国际标准
原理:把整个xml文档一次性读出,放在一个树形结构里,在需要的时候查找指定节点,然后对节点进行读或写,主要优势:实现简单,读写平衡。缺点:比较占内存
sax是事实标准,几乎所有的xml都支持他
原理:只在xml文档中查找特定条件的内容,并且只提取需要的内容,占用内存小,灵活,缺点就是写
解析器:Crimson Xerce(Apache) Aelfed2(dom4j)
开发工具包:Jaxp、Jdom、dome4j
JAXP开发包是J2SE的一部分,它由javax.xml、org.w3c.dom、org.xml.sax包及其子包组成。JAXP相当于jdbc
编写java程序完成xml文档的解析
DOM解析器
在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。
DocumentBuilder的对象是dom解析器,通过对应的工厂类创建
SAXParser的对象是sax解析器,通过对应的工厂类创建。
Javax.xml.parsers包(打开帮助文档,讲解一下)中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。
l 调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();
l 调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
DocumentBuilder db=factory.newDocumentBuilder();
l 调用 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));
Node节点类型定义了作为节点的共性。getNodeName() getNodeType() getNodeValue()
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文档中有几个节点?节点的名称和类型是什么以及节点的值
doc.getChildNodes().getLength();//通过doc文本对象调用getChildNodes()方法返回节点列表,调用getLength()方法,查看节点个数
Node root=doc.getChildNodes().item(0);//输出找到的第一个节点----根节点
System.out.println(root.getNodeName()+" "+root.getNodeType()+" "+root.getNodeValue());//根节点的名字,类型,值
}
public static void findChildren(Node node){//node代表文档对象
//把书架里的所有子节点都找到
//先通过文档对象node 得到根节点对象
Node root=node.getChildNodes().item(0);//得到根节点
NodeList list=root.getChildNodes();//通过根节点root对象得到根节点对象的所有子节点,所有的子节点返回一个节点的结合
System.out.println("根节点下的所有子节点个数"+list.getLength());
for(int i=0;i<list.getLength();i++){
//定义节点对象n,取root对象中的第i个元素
Node n=list.item(i);
System.out.println(n.getNodeName()+" "+n.getNodeType()+" "+n.getNodeValue());
//如果该方法的参数是Document类型的doc对象,获取根节点的方法可以为:
//Node root=doc.getElementByTagName("书架").item(0);//getElementByTagName("书架")返回的还是一个节点列表,.item(0)返回根节点
}
}
//遍历属性
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);//attr类型即属性类型的节点
//输出该节点的信息
System.out.println(d.getNodeName()+" "+d.getNodeType()+" "+d.getNodeValue());
}
}
}