dom解析xml

為什么80%的碼農都做不了架構師?>>> ??hot3.png

轉載自:http://www.cnblogs.com/shenliang123/archive/2012/05/11/2495252.html

使用eclipse需要手動導入crimson.jar包

org.w3c.dom(java dom)解析XML文檔

位于org.w3c.dom操作XML會比較簡單,就是將XML看做是一顆樹,DOM就是對這顆樹的一個數據結構的描述,但對大型XML文件效果可能會不理想

首先來了解點Java DOM 的 API:
1.解析器工廠類:DocumentBuilderFactory

創建的方法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

2.解析器:DocumentBuilder

創建方法:通過解析器工廠類來獲得?DocumentBuilder db = dbf.newDocumentBuilder();

3.文檔樹模型Document

創建方法:a.通過xml文檔?Document doc = db.parse("bean.xml");??b.將需要解析的xml文檔轉化為輸入流?InputStream is = new FileInputStream("bean.xml");

?Document doc = db.parse(is);?

Document對象代表了一個XML文檔的模型樹,所有的其他Node都以一定的順序包含在Document對象之內,排列成一個樹狀結構,以后對XML文檔的所有操作都與解析器無關,

直接在這個Document對象上進行操作即可;

?包含的方法:

4.節點列表類NodeList

NodeList代表了一個包含一個或者多個Node的列表,根據操作可以將其簡化的看做為數組

5.節點類Node

Node對象是DOM中最基本的對象,代表了文檔樹中的抽象節點。但在實際使用中很少會直接使用Node對象,而是使用Node對象的子對象Element,Attr,Text等

6.元素類Element

是Node類最主要的子對象,在元素中可以包含屬性,因而Element中有存取其屬性的方法

7.屬性類Attr

代表某個元素的屬性,雖然Attr繼承自Node接口,但因為Attr是包含在Element中的,但并不能將其看做是Element的子對象,因為Attr并不是DOM樹的一部

基本的知識就到此結束,更加具體的大家可以參閱JDK API文檔

?

實戰:

1.使用DOM來遍歷XML文檔中的全部內容并且插入元素:

school.xml文檔:

復制代碼
<?xml version = "1.0" encoding = "utf-8"?>
<School><Student><Name>沈浪</Name><Num>1006010022</Num><Classes>信管2</Classes><Address>浙江杭州3</Address><Tel>123456</Tel></Student><Student><Name>沈1</Name><Num>1006010033</Num><Classes>信管1</Classes><Address>浙江杭州4</Address><Tel>234567</Tel></Student><Student><Name>沈2</Name><Num>1006010044</Num><Classes>生工2</Classes><Address>浙江杭州1</Address><Tel>345678</Tel></Student><Student><Name>沈3</Name><Num>1006010055</Num><Classes>電子2</Classes><Address>浙江杭州2</Address><Tel>456789</Tel></Student>
</School>
復制代碼

DomDemo.java

復制代碼
package xidian.sl.dom;import java.io.FileOutputStream;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;import org.apache.crimson.tree.XmlDocument;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;public class DomDemo {/*** 遍歷xml文檔* */public static void queryXml(){try{//得到DOM解析器的工廠實例DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();//從DOM工廠中獲得DOM解析器DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();//把要解析的xml文檔讀入DOM解析器Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");System.out.println("處理該文檔的DomImplementation對象  = "+ doc.getImplementation());//得到文檔名稱為Student的元素的節點列表NodeList nList = doc.getElementsByTagName("Student");//遍歷該集合,顯示結合中的元素及其子元素的名字for(int i = 0; i< nList.getLength() ; i ++){Element node = (Element)nList.item(i);System.out.println("Name: "+ node.getElementsByTagName("Name").item(0).getFirstChild().getNodeValue());System.out.println("Num: "+ node.getElementsByTagName("Num").item(0).getFirstChild().getNodeValue());System.out.println("Classes: "+ node.getElementsByTagName("Classes").item(0).getFirstChild().getNodeValue());System.out.println("Address: "+ node.getElementsByTagName("Address").item(0).getFirstChild().getNodeValue());System.out.println("Tel: "+ node.getElementsByTagName("Tel").item(0).getFirstChild().getNodeValue());}}catch (Exception e) {// TODO: handle exception
            e.printStackTrace();}}/*** 向已存在的xml文件中插入元素* */public static void insertXml(){Element school = null;Element student = null;Element name = null;Element num = null;Element classes = null;Element address = null;Element tel = null;try{//得到DOM解析器的工廠實例DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();//從DOM工廠中獲得DOM解析器DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();//把要解析的xml文檔讀入DOM解析器Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");//得到文檔名稱為Student的元素的節點列表NodeList nList = doc.getElementsByTagName("School");school = (Element)nList.item(0);//創建名稱為Student的元素student = doc.createElement("Student");//設置元素Student的屬性值為231student.setAttribute("examId", "23");//創建名稱為Name的元素name = doc.createElement("Name");//創建名稱為 香香 的文本節點并作為子節點添加到name元素中name.appendChild(doc.createTextNode("香香"));//將name子元素添加到student中
            student.appendChild(name);/*** 下面的元素依次加入即可* */num = doc.createElement("Num");num.appendChild(doc.createTextNode("1006010066"));student.appendChild(num);classes = doc.createElement("Classes");classes.appendChild(doc.createTextNode("眼視光5"));student.appendChild(classes);address = doc.createElement("Address");address.appendChild(doc.createTextNode("浙江溫州"));student.appendChild(address);tel = doc.createElement("Tel");tel.appendChild(doc.createTextNode("123890"));student.appendChild(tel);//將student作為子元素添加到樹的根節點school
            school.appendChild(student);//將內存中的文檔通過文件流生成insertSchool.xml,XmlDocument位于crison.jar下((XmlDocument)doc).write(new FileOutputStream("src/xidian/sl/dom/insertSchool.xml"));System.out.println("成功");}catch (Exception e) {// TODO: handle exception
            e.printStackTrace();}    }public static void main(String[] args){//讀取
        DomDemo.queryXml();//插入
        DomDemo.insertXml();}
}
復制代碼

?

運行后結果:

?


然后到目錄下查看生成的xml文件:

打開查看內容:

上面添加元素后輸出的文件與之前的文件不是同一個文件,如果需要輸出到原文件中,那么只要將路徑改為原文間路徑即可:src/xidian/sl/dom/school.xml

?2.創建XML過程與插入過程相似,就是Document需要創建

復制代碼
package xidian.sl.dom;import java.io.FileOutputStream;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;import org.apache.crimson.tree.XmlDocument;
import org.w3c.dom.Document;
import org.w3c.dom.Element;public class CreateNewDom {/*** 創建xml文檔* */public static void createDom(){Document doc;Element school,student;Element name = null;Element num = null;Element classes = null;Element address = null;Element tel = null;try{//得到DOM解析器的工廠實例DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();//從DOM工廠中獲得DOM解析器DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();//創建文檔樹模型對象doc = dbBuilder.newDocument();if(doc != null){//創建school元素school = doc.createElement("School");//創建student元素student = doc.createElement("Student");//設置元素Student的屬性值為231student.setAttribute("examId", "23");//創建名稱為Name的元素name = doc.createElement("Name");//創建名稱為 香香 的文本節點并作為子節點添加到name元素中name.appendChild(doc.createTextNode("香香"));//將name子元素添加到student中
                student.appendChild(name);/*** 下面的元素依次加入即可* */num = doc.createElement("Num");num.appendChild(doc.createTextNode("1006010066"));student.appendChild(num);classes = doc.createElement("Classes");classes.appendChild(doc.createTextNode("眼視光5"));student.appendChild(classes);address = doc.createElement("Address");address.appendChild(doc.createTextNode("浙江溫州"));student.appendChild(address);tel = doc.createElement("Tel");tel.appendChild(doc.createTextNode("123890"));student.appendChild(tel);//將student作為子元素添加到樹的根節點school
                school.appendChild(student);//添加到文檔樹中
                doc.appendChild(school);//將內存中的文檔通過文件流生成insertSchool.xml,XmlDocument位于crison.jar下((XmlDocument)doc).write(new FileOutputStream("src/xidian/sl/dom/createSchool.xml"));System.out.println("創建成功");}}catch (Exception e) {// TODO: handle exception
            e.printStackTrace();}}public static void main(String[] args) {CreateNewDom.createDom();}
}
復制代碼

運行結果:

DOM的操作應該還是非常簡單明了的,掌握了沒哦。

?

?

?

?

轉載于:https://my.oschina.net/zjcx/blog/679549

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458475.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458475.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458475.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

逃離北上廣:你以為回到小城市就非常幸福了嗎?

忘記在哪兒看的了。感覺不錯&#xff0c;隨手發出來。我博客也有更新&#xff0c;底下有留個人博客鏈接 在過去幾年里。“逃離北上廣”一直是一個熱門短語。拿我自己來說&#xff0c;工作在上海&#xff0c;但又不是上海人。畢業后&#xff0c;就選擇租房&#xff0c;首先就為這…

Redefinition of enumerator ios

添加文件之后 報 Redefinition of enumerator iOS 原因是&#xff1a;重復添加文件 仔細檢查檢查

[WinForm] VS2010發布、打包安裝程序(超全超詳細)

from: http://blog.csdn.net/y13156556538/article/details/555321841、 在vs2010 選擇“新建項目”→“ 其他項目類型”→“ Visual Studio Installer→“安裝項目”&#xff1a; &#xff08;如果是在solution中添加&#xff0c;就直接solution -- 右鍵 -- 添加project&#…

易貨Beta版本發布說明

說明 由于前幾天確實比較忙&#xff0c;所以沒來得及寫發布說明。 功能 我們在beta版本主要加入了以下幾個功能&#xff1a; 一&#xff1a;增加了用戶的發布界面 二&#xff1a;增加了用戶的購買界面 三&#xff1a;使用下拉刷新取代了之前的handler后臺更新 四&#xff1a;優…

【譯】什么導致了Context泄露:Handler內部類

思考下面代碼 1 public class SampleActivity extends Activity { 2 3 private final Handler mLeakyHandler new Handler() { 4 Override 5 public void handleMessage(Message msg) { 6 // ... 7 } 8 } 9 } 如果沒有仔細觀察&#xff0c;上面的代碼…

js基礎 one

js忽略空格符和換行符 js嚴格區分大小寫 &#xff1b;為js的結束符 可以使用{}擴成一個語句組&#xff0c;形成一個block塊 通過 \ 實現折行操作 document.write(hello \world); 通過document.write() 向文檔書寫內容 通過xonsole.log()向控制臺寫入內容變量 js變量重名會產…

關于.Net中Process和ProcessStartInfor的使用

System.Diagnostics.Process.Start(); 能做什么呢&#xff1f;它主要有以下幾個功能&#xff1a;1、打開某個鏈接網址&#xff08;彈窗&#xff09;。2、定位打開某個文件目錄。3、打開系統特殊文件夾&#xff0c;如“控制面板”等。那么它是怎么實現這幾個功能的呢&#xff1f…

Sublime 的中文亂碼問題

Sublime Text 是現在最受歡迎的文本編輯器&#xff0c;沒有之一。它非常簡潔&#xff0c;而且對各種代碼的高亮顯示很美觀。但是&#xff0c;它默認不支持 GBK、Shift-JIS 等中文、日本編碼格式&#xff0c;故打開此類文件會出現亂碼。 安裝 Package Control 首先要安裝一個包控…

蘋果應用上架遇到的問題(2017年4月27日)

在更新app store的時候報&#xff08;如圖&#xff09;&#xff1a; ERROR ITMS-90086: "Missing 64-bit support. iOS apps submitted to the App Store must include 64-bit support and be built with the iOS 8 SDK or later. We recommend using the default "S…

工作者對象HttpWorkerRequest

在ASP.NET中&#xff0c;用于處理的請求&#xff0c;需要封裝為HttpWorkerRequest類型的對象。該類為抽象類&#xff0c;定義在命名空間System.Web下。 #region Assembly System.Web.dll, v4.0.0.0 // C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFr…

C#輸入輸出重定向

當 Process 將文本寫入其標準流中時&#xff0c;通常將在控制臺上顯示該文本。通過重定向 StandardOutput 流&#xff0c;可以操作或取消進程的輸出。例如&#xff0c;可以篩選文本、用不同方式將其格式化&#xff0c;也可以將輸出同時寫入控制臺和指定的日志文件中。有兩種方式…

C語言筆試常考知識點

1. const 關鍵字 a) const int a; b) int const a; c) const int *a; d) int * const a; e) int const * const a; 解析&#xff1a; a) a為一個int型變量&#xff0c;在它被定義時就應當對其初始化&#xff0c;因為以后就沒有機會再去改變它了。 b) 與 a) 是一個意思&a…

蘋果應用上架,一些信息的勾選(2017年4月27日)

1、分級的各種選項的選擇全部選否 &#xff08;我們公司是醫療相關的app&#xff0c;醫療的選項也是選擇的否&#xff09; 2、

jsp頁面路徑問題

jsp路徑默認不是項目跟路徑 一、 <% page language"java" import"java.util.*" pageEncoding"utf-8"%> <% String path request.getContextPath(); String basePath request.getScheme() "://" request.getServerName() …

C# 線程池ThreadPool

什么是線程池&#xff1f;為什么要用線程池&#xff1f;怎么用線程池&#xff1f; 1. 什么是線程池&#xff1f;.NET Framework的ThreadPool類提供一個線程池&#xff0c;該線程池可用于執行任務、發送工作項、處理異步 I/O、代表其他線程等待以及處理計時器。那么什么是線程池…

蘋果應用上架,圖片的要求(2017年4月27日)

看這個提示應該就明白了吧。 哈哈&#xff0c;我還是自己再說一遍加深一下印象吧&#xff1a;如果應用在各個尺寸iphone屏幕上面外觀一樣&#xff0c;就只準備5.5英寸的圖就可以了&#xff1b;如果有所不同&#xff0c;就按照實際情況&#xff0c;準備不同屏幕尺寸的圖片即可。…

jQuery操作checkbox

2012歐洲杯"死亡之組"小組出線的國家隊是&#xff1a;<br> <inputtype"checkbox"name"nation"value"Germany">德國 <inputtype"checkbox"name"nation"value"Denmark">丹麥 <input…

android Instrumentation 轉載

Android提供了一系列強大的測試工具&#xff0c;它針對Android的環境&#xff0c;擴展了業內標準的JUnit測試框架。盡管你可以使用JUnit測試Android工程&#xff0c;但Android工具允許你為應用程序的各個方面進行更為復雜的測試&#xff0c;包括單元層面及框架層面。Android測試…

Linker command failed with exit code 1(use -v to see invocation)

Linker command failed with exit code 1(use -v to see invocation) 出現這個問題的原因是&#xff1a;工程當中存在相同的文件&#xff0c;找到該文件將其刪除即可

【C#學習筆記】使用C#中的Dispatcher

form:https://www.jianshu.com/p/0714fc755988之前的文章說過了如何使用BackgroundWorker&#xff0c;今天要說的是WPF程序員處理多線程的另外一個方式 - Dispatcher當我們打開一個WPF應用程序即開啟了一個進程&#xff0c;該進程中至少包含兩個線程。一個線程用于處理呈現&…