XML的编程 (CRUD)

CRUD代表的是--------增删改查

Xml编程的作用之一:在web中写配置文件,对文件进行解析

       1、XML解析技术

        (1)XML解析方式分为两种:      Sax 和dom

                 (1)这两种标准并不是针对java,在各种语言环境下都可以实现

                 (2)dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。

实现原理:把整个xml文档一次性读取出来,放到一个树形结构里,在需要的时候,查找特定节点,然后对节点进行读取和写。它的主要优势是实现简单,读写平衡,缺点是比较占内存,因为他要把整个xml文档都读入内存,文件越大,这种缺点就越明显。

(3)(Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

         实现方法:在xml文档中查找特定条件的内容,只提取需要的内容       

                                   缺点:只能写     

                (4)Xml解析器:  用开发工具包来创建解析器

                             Crimson、Xerces 、Aelfred2

                (5)Xml开发工具包

                (6)Jaxp开发包

                             Jaxp、Jdom、dom4j

(2)JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成

            在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象

使用JAXP进行DOM解析

                  方法为:javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。

获得JAXP中的DOM解析器

        (1)调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。

       (2)调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

       (3)调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

DOM编程

l            DOM模型(document object model)

DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。

在dom中,节点之间关系如下:

         位于一个节点之上的节点是该节点的父节点(parent)

         一个节点之下的节点是该节点的子节点(children)

         同一层次,具有相同父节点的节点是兄弟节点(sibling) 

         一个节点的下一个层次的节点集合是节点后代(descendant)

          父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor)

l    Node对象

Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档)

Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了。

2、编写java程序dom方法完成xml文档的解析

通过javax.xml.parsers 包下的类来完成解析器的创建

                   DocumentBuilder的对象dom解析器,通过对于的工程类来创建

DocumentBuilderFactory是抽象的类

在工厂中用newinstance()方法来得到dom解析器的工厂类  

              SAXParser的对象是sax解析器 ,通过对于的工程类来创建

在xml文档中的所有内容都可以被当成节点处理

       在Node节点类型定义了所有的节点的共性,在Node中的属性是nodeName,nodeType,noValues,在用下面的这三个方法去调用之后,就把他们封装成Node对象,根据Node中的属性一一对应,如果节点是一个元素,则nodeValue则为null

GetNodeName()  节点的名称

getNodeType()  节点的类型

getNodeVaule()  节点的值

    Element是元素节点  1代表元素节点

    Text 文本节点  在xml中空白处是文本节点  3代表文本节点

     Attr为属性节点 

    

     例子:解析dom文档

              // (1)生成工厂类的对象

       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

       // (2)生成解析器

       DocumentBuilder db = factory.newDocumentBuilder();

       // (3)对xml文档进行解析,指定要读取的文件并赋值给Document的对象

       Document doc = db.parse(new File("src/Book.xml"));

    // 解析出的doc对象里面所有内容,在xml文档中的所有内容都可以别当成节点处理

    // (4)读取book.xml文档中有几个节点?节点的名称?节点的类型及节点的值

       Node root = doc.getChildNodes().item(0);// 查找根节点

       System.out.println(root.getNodeName() + "---" +root.getNodeType()+ "---" + root.getNodeValue());

// 查找所有根节点的子节点

    public static void findChildren(Document doc) {

       // 先通过文档对象node得到根节点对象,通过根节点

       // Node root = node.getChildNodes().item(0);//得到根节点

       // 通过标签名字查找元素,得到的是节点列表

       Node root = doc.getElementsByTagName("书架").item(0);

       // 通过根节点root对象得到根节点所有的子节点,返回一个节点集合

       NodeList list = root.getChildNodes();

       System.out.println("根节点下的所有子节点个数" + list.getLength());

       // item()返回集合中的第 index 个项。

       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 findElementChildren(Document doc) {

       // 先通过文档对象doc得到根节点对象,通过根节点

       Node root = doc.getElementsByTagName("书架").item(0);

  // 通过根节点root对象得到根节点所有的子节点,返回一个节点集合

       NodeList list = root.getChildNodes();

       System.out.println("根节点下的所有子节点个数" + list.getLength());

       boolean flag = false;

       int count = 0;

       for (int i = 0; i < list.getLength(); i++) {

           Node n = list.item(i);

           // 判断如果是元素节点      ELEMENT_NODE表示 该节点为 Element。

           if (n.getNodeType() == Node.ELEMENT_NODE) {

              System.out.println(n.getNodeName() + "-----" + n.getNodeType()

                     + "----" + n.getNodeValue());

              count++;

              flag = true;

           }

       }

       System.out.println("元素的节点共" + count);

    }

    // 查找固定值的书的元素的第二个子节点

    public static void findFixedChildren(Node node) {

       NodeList list = node.getChildNodes();

       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 < list.getLength(); j++) {

                  Node n = list1.item(j);

                  System.out.println(n.getNodeName() + "-----"

                         + n.getNodeType() + "----" + n.getNodeValue());

              }

           }

       }

    }

// 属性的遍历

    public static void findAttiutes(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、付费专栏及课程。

余额充值