zoukankan      html  css  js  c++  java
  • Java解析XML文档——dom解析xml

    一、前言

      用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器。

      JAXP接口包含了三个包:

      (1)org.w3c.dom

      W3C推荐的用于XML标准规划文档对象模型的接口。

      (2)org.xml.sax

      用于对XML进行语法分析的事件驱动的XML简单API(SAX)

      (3)javax.xml.parsers解析器工厂工具,程序员获得并配置特殊的特殊语法分析器。

      二、前提

      DOM编程不要其它的依赖包,因为JDK里自带的JDK里含有的上面提到的org.w3c.dom、org.xml.sax 和javax.xml.parsers包就可以满意条件了。

      三、使用DOM解析XML文档

      我们现在来看看DOM是如何解析XML的吧!同样的,我将从一个简单的不能再简单的例子来说明DOM是如何解析XML文档的,先让我们看看XML是什么内容吧:

      <?xml version="1.0" encoding="gb2312"?>

      <books>

      <book email="zhoujunhui">

      <name>rjzjh</name>

      <price>jjjjjj</price>

      </book>

      </books>

      简单的不能再简单了。但是该有的都有了,根元素、属性、子节点。好了,能反应问题就行了,下面来看看解析这个XML文件的Java代码吧!

      1 public class DomParse {

      2

      public DomParse(){

      3

      DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();

      4

      try {

      5

      DocumentBuilder dombuilder=domfac.newDocumentBuilder();

      6

      InputStream is=new FileInputStream("bin/library.xml");

      7

      Document doc=dombuilder.parse(is);

      8

      9

      Element root=doc.getDocumentElement();

      10

      NodeList books=root.getChildNodes();

      11

      if(books!=null){

      12

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

      13

      Node book=books.item(i);

      14

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

      15

      String email=book.getAttributes().getNamedItem("email").getNodeValue();

      16

      System.out.println(email);

      17

      for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){

      18

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

      19

      if(node.getNodeName().equals("name")){

      20

      String name=node.getNodeValue();

      21

      String name1=node.getFirstChild().getNodeValue();

      22

      System.out.println(name);

      23

      System.out.println(name1);

      24

      }

      25

      if(node.getNodeName().equals("price")){

      26

      String price=node.getFirstChild().getNodeValue();

      27

      System.out.println(price);

      28

      }

      29

      }

      30

      }

      31

      }

      32

      }

      33

      }

      34

      } catch (ParserConfigurationException e) {

      35

      e.printStackTrace();

      36

      } catch (FileNotFoundException e) {

      37

      e.printStackTrace();

      38

      } catch (SAXException e) {

      39

      e.printStackTrace();

      40

      } catch (IOException e) {

      41

      e.printStackTrace();

      42

      }

      43

      }

      44

      public static void main(String[] args) {

      45

      new DomParse();

      46

      }

      47 }

      四、代码解释

      先看看这个程序引用类:

      import java.io.FileInputStream;

      import java.io.FileNotFoundException;

      import java.io.IOException;

      import java.io.InputStream;

      import javax.xml.parsers.DocumentBuilder;

      import javax.xml.parsers.DocumentBuilderFactory;

      import javax.xml.parsers.ParserConfigurationException;

      //下面主要是org.xml.sax包的类

      import org.w3c.dom.Document;

      import org.w3c.dom.Element;

      import org.w3c.dom.Node;

      import org.w3c.dom.NodeList;

      import org.xml.sax.SAXException;

      上面那么简单的代码一看就明白了,但是为了介绍个DOM编程的大概还是来看看这个程序吧:

      (1)得到DOM解析器的工厂实例

      DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();

      得到javax.xml.parsers.DocumentBuilderFactory;类的实例就是我们要的解析器工厂

      (2)从DOM工厂获得DOM解析器

      DocumentBuilder dombuilder=domfac.newDocumentBuilder();

      通过javax.xml.parsers.DocumentBuilderFactory实例的静态方法newDocumentBuilder()得到DOM解析器

      (3)把要解析的XML文档转化为输入流,以便DOM解析器解析它

      InputStream is=new FileInputStream("bin/library.xml");

      InputStream是一个接口。

      (4)解析XML文档的输入流,得到一个Document

      Document doc=dombuilder.parse(is);

      由XML文档的输入流得到一个org.w3c.dom.Document对象,以后的处理都是对Document对象进行的

      (5)得到XML文档的根节点

      Element root=doc.getDocumentElement();

      在DOM中只有根节点是一个org.w3c.dom.Element对象。

      (6)得到节点的子节点

      NodeList

      books=root.getChildNodes();

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

      Node book=books.item(i);

      }

      这是用一个org.w3c.dom.NodeList接口来存放它所有子节点的,还有一种轮循子节点的方法,后面有介绍

      (7)取得节点的属性值

      String email=book.getAttributes().getNamedItem("email").getNodeValue();

      System.out.println(email);

      注意,节点的属性也是它的子节点。它的节点类型也是Node.ELEMENT_NODE

      (8)轮循子节点

      for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){

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

      if(node.getNodeName().equals("name")){

      String name=node.getNodeValue();

      String name1=node.getFirstChild().getNodeValue();

      System.out.println(name);

      System.out.println(name1);

      }

      if(node.getNodeName().equals("price")){

      String price=node.getFirstChild().getNodeValue();

      System.out.println(price);

      }

      }

      这段代码的打印输出为:

      null

      alterrjzjh

      jjjjjj

      从上面可以看出

      String name=node.getNodeValue();

      是一个空值。而

      String name1=node.getFirstChild().getNodeValue();

      才是真正的值,这是因为DOM把<name>rjzjh</name>也当作是两层结构的节点,其父节点  

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1926400

  • 相关阅读:
    PAT1118:Birds in Forest
    PAT1112:Stucked Keyboard
    PAT1091:Acute Stroke
    Java基础006 --- 类、接口、对象
    Java基础005 --- 安全管理器、可变参数等
    Java基础004 --- BigInteger和BigDecimal
    Java基础003 --- 原始数据类型
    maven完整学习笔记(2)--- 依赖范围和依赖传递
    maven完整学习笔记(1)--- 基本概念及基础命令
    Java编译器007---javac 其它选项
  • 原文地址:https://www.cnblogs.com/licheng/p/1128366.html
Copyright © 2011-2022 走看看