zoukankan      html  css  js  c++  java
  • DOM解析XML文件例子

    DOM解析XML文件是一次性将目标文件中的所有节点都读入,然后再进行后续操作的方式。

    一般分为以下几步:

    1. 定义好目标XML文件路径path

    2. 实例化DOM解析工厂对象 ,DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(),这种工厂类都不能用new的方式直接产生对象,必须用调用类的newInstance方法来产生对象。

    3. 用上面的工厂对象生成DOM解析器对象 ,DocumentBuilder builder = factory.newDocumentBuilder()。

    4. 用解析器对象对目标XML文件进行解析,得到Document文件对象 ,Document doc = builder.parse(path)。

    5. 处理Document文件,获得XML文件的所有信息。 得到上面的doc对象也就相当于得到了树的根节点,就可以逐步对这可dom树进行遍历获得所有的节点信息,由于树的定义就是递归定义的,所以这里的遍历采用递归的思想最为简单。

    代码如下:

    首先是目标XML文件

    <?xml version="1.0" encoding="utf-8"?>
    <student>
      <stu num="1111">
        <name>张三丰</name>
        <sex></sex>
        <cla>武当</cla>
      </stu>
      <stu num="2345">
        <name>小龙女</name>
        <sex></sex>
        <cla>古墓</cla>
      </stu>
    </student>

    然后是解析的代码:

    public class Domparse {
      //用来保存解析出来的学生对象的动态链表
      static ArrayList<Student> list = new ArrayList<Student>();
      static Student stu;
      public static void main(String[] args) throws Exception {
        String path = "D:\xmlEX\student2.xml";
        //实例化一个用来产生DOM解析器的工厂对象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //使用工厂得到一个DOM解析器对象
        DocumentBuilder builder = factory.newDocumentBuilder();
        //解析指定的xml文件或者数据流买得到DOM对象
        Document doc = builder.parse(path);
        //通过DOM对象获得其中的数据,递归进行遍历
        parseXML(doc);
        for(Student s:list){
          System.out.println(s);
        }
      }
      /**
       * 递归解析XML文件
       * @param doc 
       */
      public static void parseXML(Node doc){
        //获得doc的所有子节点
        NodeList nodes = doc.getChildNodes();
        //遍历所有子节点
        for(int i=0;i<nodes.getLength();i++){
          Node node1 = nodes.item(i);
          //获得节点的名字
          String str = node1.getNodeName();
          //如果这个节点是一个元素节点
          if(node1 instanceof Element){
            //如果节点名字为stu则创建一个student对象存入队列,并且获得它的num属性
            if(str.equals("stu")){
              stu = new Student();
              list.add(stu);
              //获得该元素节点的num属性
              String num = ((Element)node1).getAttribute("num");
              stu.num = Integer.parseInt(num);
            }else if(str.equals("name")){
              stu.name = node1.getTextContent();
            }else if(str.equals("sex")){
              stu.sex = node1.getTextContent();
            }else if(str.equals("cla")){
              stu.cla = node1.getTextContent();
            }
          }
          parseXML(node1);
        }
      }
    }
  • 相关阅读:
    高可用
    网络线之坑:线序接错了,导致时常出现“未识别的网络”
    Cocos2d-x 坑之一:Xcode文件真实目录与工程视图目录
    【转】ios中@class和 #import 的使用时机
    virtualenv 模块
    pipreqs 组件
    5.15 pymysql 模块
    5.14 数据库函数,流程控制
    5.13 数据库存储过程
    5.12 数据库事务
  • 原文地址:https://www.cnblogs.com/wxishang1991/p/4460495.html
Copyright © 2011-2022 走看看