黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 Java中的dom解析xml

Java中的dom解析xml

更新時間:2022-12-20 16:07:22 來源:動力節點 瀏覽629次

一、Java解析xml、解析xml四種方法、DOM、SAX、JDOM、DOM4j、XPath

此文針對其中的DOM方法具體展開介紹及代碼分析

sax、dom是兩種對xml文檔進行解析的方法(沒有具體實現,只是接口),所以只有它們是無法解析xml文檔的;jaxp只是api,它進一步封裝了sax、dom兩種接口,并且提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser(默認使用xerces解釋器)。如果是嵌入式的情況下建議使用sax方法進行解析,因為它不需要一下子把數據都保存到內存中然后再解析是可以逐步解析的。而DOM不行,必須一次性把數據存到內存中,然后一并解析。這樣做雖然速度會很快,但是同時也加大了對內存的消耗。如果文件很大的情況下不建議DOM解析

二、【DOM 簡單使用介紹】

1、【DOM(Document Object Model) 】

由W3C提供的接口,它將整個XML文檔讀入內存,構建一個DOM樹來對各個節點(Node)進行操作。

下面一段是DOM解析xml的一個案例一起來看一下。

【xml原文件】

<?xml version = "1.0" encoding = "UTF-8"?>
<staffs>
  <staff id="1">
    <name>Tom_zhang1</name>
    <age>19</age>
    <sex>男</sex>
    <phone>18677435526</phone>
    <group>
      <id>1</id>
      <name>Technical department</name>
    </group>
  </staff>
  <staff id="2">
    <name>Susy_wang</name>
    <age>18</age>
    <sex>女</sex>
    <phone>18962459987</phone>
    <group>
      <id>2</id>
      <name>Financial department</name>
    </group>
  </staff>
 
  <staff id="3">
    <name>Jack_Ma</name>
    <age>45</age>
    <sex>男</sex>
    <phone>1867755334</phone>
    <group>
      <id>3</id>
      <name>Financial department</name>
    </group>
  </staff>
</staffs>

【代碼】

Staff 類

package Entity;

public class Staff {
  
  private int id;
  private String name;
  private int age;
  private String sex;
  private String phone;
  private StuGroup group;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getSex() {
    return sex;
  }
  public void setSex(String sex) {
    this.sex = sex;
  }
  public String getPhone() {
    return phone;
  }
  public void setPhone(String phone) {
    this.phone = phone;
  }
  public StuGroup getGroup() {
    return group;
  }
  public void setGroup(StuGroup group) {
    this.group = group;
  }
  public Staff() {
    super();
    // TODO Auto-generated constructor stub
  }
  public Staff(int id, String name, int age, String sex, String phone,
      StuGroup group) {
    super();
    this.id = id;
    this.name = name;
    this.age = age;
    this.sex = sex;
    this.phone = phone;
    this.group = group;
  }
  @Override
  public String toString() {
    return "Staff [age=" + age + ", group=" + group + ", id=" + id
        + ", name=" + name + ", phone=" + phone + ", sex=" + sex + "]";
  }
}

Group 類

package Entity;

public class Group {
  
  private int id;
  private String name;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Group() {
    super();
    // TODO Auto-generated constructor stub
  }
  public Group(int id, String name) {
    super();
    this.id = id;
    this.name = name;
  }
  @Override
  public String toString() {
    return "Group [id=" + id + ", name=" + name + "]";
  } 
}

注釋: Staff類不需解釋,xml文件中有幾個<>就需要創建幾個字段。Group類的創建是因為group本身又是一個節點,它有它自己的字段。因此在這邊把這種情況單獨作為一個類創建,同時也方便日后維護管理。依次類推如果有更多的子類,方法一樣創建相應的類即可。

無論是DOM解析還是SAX解析,都是通過一個叫做Parser的解釋器,來對xml文件進行解析。而這個解析器是需要我們手動創建的,接下來就一起來看一下解釋器中的代碼,也是最主要的代碼。

Dom_parser(解析器)

package Parser;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

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;

import Entity.StuGroup;
import Entity.Staff;

public class Dom_parser {

  public static List<Staff> parser(String fileName) {

    List<Staff> staffs = new ArrayList<Staff>(); //創建一個ArrayList來裝數據

    DocumentBuilderFactory factory = null;  //DocumentBuilderFactory,DocumentBuilder,Document分別是DOM解析的工廠類
    DocumentBuilder builder = null;
    Document doc = null;
    Staff staff = null;           //方便日后實例化
    StuGroup group = null;         //同上

    try {
      factory = DocumentBuilderFactory.newInstance();  //工廠類實例化
      builder = factory.newDocumentBuilder();      //工廠類實例化
      doc = builder.parse(new File(fileName));     //通過.parser方法加載文件

      Element root = doc.getDocumentElement();     //Element方法中的.getDocumentElement()代表獲取xml文件的頭文件內容

      NodeList nodelist = root.getElementsByTagName("staff"); //獲取TagName,每一個<>中的字段為一個TagName.作為一個nodelist來保存
            //循環這個NodeList,然后得到每個nodelist中的item。根據獲取到的值的索引最終通過.set方法得到這個值
      for (int index = 0; index < nodelist.getLength(); index++) {
        staff = new Staff();
        Node node = nodelist.item(index);
        staff.setId(Integer.parseInt(node.getAttributes().getNamedItem(
            "id").getTextContent()));
        // System.out.println(staff);

        NodeList childNode = node.getChildNodes();  //設置一個childNode為了存放nodelist下子<>中的TagName
                  //同上循環子childNode這個list,獲取到每個元素的下標。再通過.set方法分別得到每個元素的值。
        for (int i = 0; i < childNode.getLength(); i++) {
          Node childitem = childNode.item(i);
          if (childitem.getNodeName().equals("name")) {
            staff.setName(childitem.getTextContent());
          } else if (childitem.getNodeName().equals("age")) {
            staff.setAge(Integer.parseInt(childitem
                .getTextContent()));
          } else if (childitem.getNodeName().equals("sex")) {
            staff.setSex(childitem.getTextContent());
          } else if (childitem.getNodeName().equals("phone")) {
            staff.setPhone(childitem.getTextContent());
          } else if (childitem.getNodeName().equals("group")) {
            NodeList groupnode = childitem.getChildNodes();

            for (int j = 0; j < groupnode.getLength(); j++) {
              Node groupitem = groupnode.item(j);
                            
              if (groupitem.getNodeName().equals("id")) {
                group = new StuGroup(); //這里的實例化很重要,切記不要實例化錯誤地方
                String groupId = groupitem.getTextContent();
                group.setId(Integer.parseInt(groupId));
                staff.setGroup(group);
              } else if (groupitem.getNodeName().equals("name")) {
                String groupName = groupitem.getTextContent();
                group.setName(groupName);
                staff.setGroup(group);
              }
            }

          }

        }
        staffs.add(staff); //最終我們要把staff這個對象追加到staffs這個集合中。
      }

    } catch (ParserConfigurationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (SAXException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return staffs; //返回這個集合
  }
}

【測試類】

package Parser;
 
import java.util.List;
 
import Entity.Staff;
 
public class Test {
   
  public static void main(String[] args) {
     
    String file = "C:/Users/IBM_ADMIN/Desktop/xml/staff.xml";  //指定文件地址
    List<Staff> staffs = Dom_parser.parser(file);  //因為我們創建的解析器的名字叫Dom_parser所以在這里調用Dom_parser.parser()方法。()中參數為文件地址。        //循環并打印結果
    for(Staff list:staffs){
      System.out.println(list);
    }
  }
}

【打印結果】

打印結果如下。可以看到xml中每個TageName以及對應的值,通過DOM解析的方式把結果都一一的被獲取并打印出來了。

目前我們是把數據放到了ArrayList內存中。后續可以把數據存放到數據庫中。

Staff [age=19, group=Group [id=1, name=Technical department], id=1, name=Tom_zhang1, phone=18677435526, sex=男]

Staff [age=18, group=Group [id=2, name=Financial department], id=2, name=Susy_wang, phone=18962459987, sex=女]

Staff [age=45, group=Group [id=3, name=Financial department], id=3, name=Jack_Ma, phone=1867755334, sex=男]

以上就是動力節點小編介紹的"Java中的dom解析xml",希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為您務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 一个人在线免费观看www | 黄色片在线视频 | 国产第一页久久亚洲欧美国产 | 男女猛烈无遮挡性视频 | 日日摸夜夜添夜夜添97 | 55夜色66夜色欧洲精品 | 天天操天天做 | 视频网站黄 | 精品 日韩 国产 欧美在线观看 | 天堂va欧美va亚洲va国产 | 欧美亚洲日本在线 | 欧美伊人久久大香线蕉在观 | 欧美激情一区二区三区视频 | 天堂网在线www资源网 | 在线观看黄免费 | 欧美色精品天天在线观看视频 | 成人亚洲综合 | 2020亚洲欧美日韩在线观看 | 精品国产一区二区三区19 | 伦理影院在线观看 | 国产成人免费片在线视频观看 | 欧美va天堂 | 免费黄色看片 | 亚洲国产成人久久三区 | 欧美日韩 国产区 在线观看 | 深夜福利网站在线观看 | 欧美亚洲欧美日韩中文二区 | 草草视频网站 | 亚洲国产成人九九综合 | 免费性爱视频 | 免费看大美女大黄大色 | 日本三级韩国三级三级a级按摩 | 波多野结衣视频在线观看 | 国产日韩欧美综合在线 | 曰本a | 国产免费又爽又黄又刺激的视频 | 亚洲区精品久久一区二区三区 | 黄色网址免费观看视频 | 97国产伦子在线观看 | 影音先锋最新资源网 | 久久综合久久久 |