XML编程(CRUD)

XML编程(CRUD)

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

                                   }

                            }

                     }*/

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值