XML编程

 

 

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());

             

           }

       }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值