日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dom4j 学习笔记

發布時間:2023/12/10 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dom4j 学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

dom4j 是一種解析 XML 文檔的開放源代碼 XML 框架。dom4j下載地址
本文主要記載了一些簡單的使用方法。

一、xml文件的解析

dom4j既可以解析普通的xml文件,也可以解析一個InputStream,先看看xml文件長什么樣子:

<books><book><id>1</id><name>Java編程思想</name><price>80</price><author>張三</author></book><book><id>2</id><name>三國演義</name><price>30</price><author>羅貫中</author></book><book><id>3</id><name>紅樓夢</name><price>35</price><author>曹雪芹</author></book><book><id>4</id><name>西游記</name><price>25</price><author>吳承恩</author></book><book><id>5</id><name>水滸傳</name><price>30</price><author>施耐庵</author></book> </books>

通過讀取這一段xml文件并解析,將xml文件中的內容存儲到javabean中。

private List<Book> bs;private Book b;//讀取xml文件獲得Document對象@Testpublic void test1(){try {//1.讀取xml文件,獲取document對象SAXReader reader = new SAXReader();Document document = reader.read(new File("F:\\test\\books.xml"));//2.獲取根節點<books>Element root = document.getRootElement();bs = new ArrayList<Book>();//3.迭代,獲取根節點的所有子節點<book>for (Iterator<Element> es = root.elementIterator(); es.hasNext();) {Element e = es.next();b = new Book();//4.再次迭代,獲取子節點的子節點<id><name><price><author>for (Iterator<Element> e_son = e.elementIterator();e_son.hasNext();) {Element ee = e_son.next();if(ee.getName().equals("id")){b.setId(Integer.parseInt(ee.getText().toString()));}else if(ee.getName().equals("name")){b.setName(ee.getText());}else if(ee.getName().equals("price")){b.setPrice(Integer.parseInt(ee.getText()));}else if(ee.getName().equals("auhtor")){b.setAuthor(ee.getText());}}bs.add(b);}} catch (DocumentException e) {e.printStackTrace();}for (Book bk : bs) {System.out.println(bk.getName());}}

Book.java

public class Book {private int id;private String name;private int price;private String author;private Detail detail;private Attribute attribute;public Attribute getAttribute() {return attribute;}public void setAttribute(Attribute attribute) {this.attribute = attribute;}public Detail getDetail() {return detail;}public void setDetail(Detail detail) {this.detail = detail;}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 getPrice() {return price;}public void setPrice(int price) {this.price = price;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;} }

Attribute.java

public class Attribute {private String category;private String edition;public String getCategory() {return category;}public void setCategory(String category) {this.category = category;}public String getEdition() {return edition;}public void setEdition(String edition) {this.edition = edition;}}

Detail.java

public class Detail {private String pressTime;private String storyTime;public String getPressTime() {return pressTime;}public void setPressTime(String pressTime) {this.pressTime = pressTime;}public String getStoryTime() {return storyTime;}public void setStoryTime(String storyTime) {this.storyTime = storyTime;} }

好,我們稍微修改一下xml文件,再看看個該如何解析:

<books><book><id>1</id><name>Java編程思想</name><price>80</price><author>張三</author><detail><pressTime>天朝</pressTime><storyTime>21世紀</storyTime></detail></book><book><id>2</id><name>三國演義</name><price>30</price><author>羅貫中</author><detail><pressTime>明朝</pressTime><storyTime>漢末</storyTime></detail></book><book><id>3</id><name>紅樓夢</name><price>35</price><author>曹雪芹</author><detail><pressTime>清朝</pressTime><storyTime>不詳</storyTime></detail></book><book><id>4</id><name>西游記</name><price>25</price><author>吳承恩</author><detail><pressTime>明朝</pressTime><storyTime>大唐</storyTime></detail></book><book><id>5</id><name>水滸傳</name><price>30</price><author>施耐庵</author><detail><pressTime>明朝</pressTime><storyTime>大宋</storyTime></detail></book> </books>

又多了一層嵌套,看解析方式:

private List<Book> bs;private Book b;private Detail detail;// 讀取xml文件獲得Document對象@Testpublic void test1() {try {// 1.讀取xml文件,獲取document對象SAXReader reader = new SAXReader();Document document = reader.read(new File("F:\\test\\books.xml"));// 2.獲取根節點<books>Element root = document.getRootElement();bs = new ArrayList<Book>();// 3.迭代,獲取根節點的所有子節點<book>for (Iterator<Element> es = root.elementIterator(); es.hasNext();) {Element e = es.next();b = new Book();// 4.再次迭代,獲取子節點的子節點<id><name><price><author>for (Iterator<Element> e_son = e.elementIterator(); e_son.hasNext();) {Element ee = e_son.next();if (ee.getName().equals("id")) {b.setId(Integer.parseInt(ee.getText().toString()));} else if (ee.getName().equals("name")) {b.setName(ee.getText());} else if (ee.getName().equals("price")) {b.setPrice(Integer.parseInt(ee.getText()));} else if (ee.getName().equals("auhtor")) {b.setAuthor(ee.getText());} else if (ee.getName().equals("detail")) {detail = new Detail();for (Iterator<Element> ds = ee.elementIterator(); ds.hasNext();) {Element d = ds.next();if (d.getName().equals("pressTime")) {detail.setPressTime(d.getText());} else if (d.getName().equals("storyTime")) {detail.setStoryTime(d.getText());}}b.setDetail(detail);}}bs.add(b);}} catch (DocumentException e) {e.printStackTrace();}for (Book bk : bs) {System.out.println(bk.getName()+","+bk.getDetail().getPressTime());}}

繼續修改xml文件,為之添加屬性:

<books><book category="編程技術" edition="8"><id>1</id><name>Java編程思想</name><price>80</price><author>張三</author><detail><pressTime>天朝</pressTime><storyTime>21世紀</storyTime></detail></book><book category="歷史小說" edition="1"><id>2</id><name>三國演義</name><price>30</price><author>羅貫中</author><detail><pressTime>明朝</pressTime><storyTime>漢末</storyTime></detail></book><book category="小說" edition="2"><id>3</id><name>紅樓夢</name><price>35</price><author>曹雪芹</author><detail><pressTime>清朝</pressTime><storyTime>不詳</storyTime></detail></book><book category="神話小說" edition="4"><id>4</id><name>西游記</name><price>25</price><author>吳承恩</author><detail><pressTime>明朝</pressTime><storyTime>大唐</storyTime></detail></book><book category="小說" edition="5"><id>5</id><name>水滸傳</name><price>30</price><author>施耐庵</author><detail><pressTime>明朝</pressTime><storyTime>大宋</storyTime></detail></book> </books>

給每一個book都添加了屬性,又該怎么遍歷呢?attribute的遍歷和element的遍歷非常類似,看代碼:

// 讀取xml文件獲得Document對象@Testpublic void test1() {try {// 1.讀取xml文件,獲取document對象SAXReader reader = new SAXReader();Document document = reader.read(new File("F:\\test\\books.xml"));// 2.獲取根節點<books>Element root = document.getRootElement();bs = new ArrayList<Book>();// 3.迭代,獲取根節點的所有子節點<book>for (Iterator<Element> es = root.elementIterator(); es.hasNext();) {Element e = es.next();b = new Book();book_attr = new lenve.test.Attribute();for (Iterator<Attribute> as = e.attributeIterator();as.hasNext();) {Attribute attr = as.next();if(attr.getName().equals("category")){book_attr.setCategory(attr.getText());}else if(attr.getName().equals("edition")){book_attr.setEdition(attr.getText());}}b.setAttribute(book_attr);// 4.再次迭代,獲取子節點的子節點<id><name><price><author>for (Iterator<Element> e_son = e.elementIterator(); e_son.hasNext();) {Element ee = e_son.next();if (ee.getName().equals("id")) {b.setId(Integer.parseInt(ee.getText().toString()));} else if (ee.getName().equals("name")) {b.setName(ee.getText());} else if (ee.getName().equals("price")) {b.setPrice(Integer.parseInt(ee.getText()));} else if (ee.getName().equals("auhtor")) {b.setAuthor(ee.getText());} else if (ee.getName().equals("detail")) {detail = new Detail();for (Iterator<Element> ds = ee.elementIterator(); ds.hasNext();) {Element d = ds.next();if (d.getName().equals("pressTime")) {detail.setPressTime(d.getText());} else if (d.getName().equals("storyTime")) {detail.setStoryTime(d.getText());}}b.setDetail(detail);}}bs.add(b);}} catch (DocumentException e) {e.printStackTrace();}for (Book bk : bs) {System.out.println(bk.getName()+","+bk.getDetail().getPressTime()+","+bk.getAttribute().getCategory());}}

如果我們只想遍歷某一個節點呢?比如我們只想遍歷名稱為id的節點,該怎么辦?

private List<Book> bs;private Book b;@Testpublic void test2() {try {// 1.讀取xml文件,獲取document對象SAXReader reader = new SAXReader();Document document = reader.read(new File("F:\\test\\books.xml"));// 2.獲取根節點<books>Element root = document.getRootElement();bs = new ArrayList<Book>();// 3.迭代,獲取根節點的所有子節點<book>for (Iterator<Element> es = root.elementIterator(); es.hasNext();) {Element e = es.next();b = new Book();// 4.再次迭代,獲取子節點的子節點<id><name><price><author>for (Iterator<Element> e_son = e.elementIterator("id"); e_son.hasNext();) {Element ee = e_son.next();b.setId(Integer.parseInt(ee.getText().toString()));}bs.add(b);}} catch (DocumentException e) {e.printStackTrace();}for (Book bk : bs) {System.out.println(bk.getId()+","+bk.getAuthor());}}

輸出:

最后一個問題,怎樣以字符串的形式拿到一個xml文件:

@Testpublic void test3(){try {SAXReader reader = new SAXReader();Document document = reader.read(new File("F:\\test\\books.xml"));String text = document.asXML();System.out.println(text);} catch (DocumentException e) {e.printStackTrace();}}

二、使用程序寫一個xml文件

1.怎樣把一個字符串文件寫成xml文件:

@Testpublic void test4() {try {String text = "<fruits><fruit><name>蘋果</name><color>red</color><price>3元</price></fruit></fruits>";Document document = DocumentHelper.parseText(text);//兩種方式皆可 // FileWriter out = new FileWriter(new File("F:\\test\\str2xml.xml"));PrintWriter out = new PrintWriter(new File("F:\\test\\s2x.xml"));document.write(out);out.close();} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

這樣輸出的xml文件沒有格式,可讀性較差,換個方式再看看:

@Testpublic void test5() {try {String text = "<fruits><fruit><name>蘋果</name><color>red</color><price>3元</price></fruit></fruits>";Document document = DocumentHelper.parseText(text);PrintWriter out = new PrintWriter(new File("F:\\test\\s2x1.xml"));XMLWriter writer = new XMLWriter(out, new OutputFormat().createPrettyPrint());writer.write(document);writer.close();} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

輸出結果:

這樣的輸出格式也是極好的。

2.通過程序一個元素一個元素的寫入:

@Testpublic void test6(){int res = createXMLFile();if(res==1){System.out.println("xml文件創建成功!");}else{System.out.println("xml文件創建失敗!");}}public int createXMLFile(){//返回0表示創建成功,返回1表示創建失敗int result = 0;Document document = DocumentHelper.createDocument();//建立根節點Element root = document.addElement("fruits");//加入注釋root.addComment("this is a xml about fruit");Element f1 = root.addElement("fruit");f1.addAttribute("color", "red");Element f11 = f1.addElement("price");f11.setText("10元");Element f12 = f1.addElement("shape");f12.setText("圓形");Element f13 = f1.addElement("name");f13.setText("蘋果");//將xml寫入文件中try {PrintWriter out = new PrintWriter(new File("F:\\test\\111.xml"));XMLWriter writer = new XMLWriter(out, new OutputFormat().createPrettyPrint());writer.write(document);writer.close();result = 1;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return result;}

再看看新創建的xml文件長什么樣:

這里使用最多的就是三個方法,一個是addElement(),一個是addAttribute(),還有一個是setText(),對每一個節點都可以執行這三個操作,你想創建的任何形狀的xml都可以通過層層的嵌套實現。

如果想手動指定輸出編碼格式:

@Testpublic void test6(){int res = createXMLFile();if(res==1){System.out.println("xml文件創建成功!");}else{System.out.println("xml文件創建失敗!");}}public int createXMLFile(){//返回0表示創建成功,返回1表示創建失敗int result = 0;Document document = DocumentHelper.createDocument();//建立根節點Element root = document.addElement("fruits");//加入注釋root.addComment("this is a xml about fruit");Element f1 = root.addElement("fruit");f1.addAttribute("color", "red");Element f11 = f1.addElement("price");f11.setText("10元");Element f12 = f1.addElement("shape");f12.setText("圓形");Element f13 = f1.addElement("name");f13.setText("蘋果");//將xml寫入文件中try {PrintWriter out = new PrintWriter(new File("F:\\test\\111.xml"));OutputFormat format = OutputFormat.createPrettyPrint();//縮進顯示//默認輸出編碼是UTF-8,可以手動設置為GBKformat.setEncoding("GBK");XMLWriter writer = new XMLWriter(out, format);writer.write(document);writer.close();result = 1;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return result;}

輸出的xml文件為(注意看編碼):

三、修改xml文件

我們要修改一下xml文件:

<books><book category="編程技術" edition="8"><id>1</id><name>Java編程思想</name><price>80</price><author>張三</author><detail><pressTime>天朝</pressTime><storyTime>21世紀</storyTime></detail></book><book category="歷史小說" edition="1"><id>2</id><name>三國演義</name><price>30</price><author>羅貫中</author><detail><pressTime>明朝</pressTime><storyTime>漢末</storyTime></detail></book><book category="小說" edition="2"><id>3</id><name>紅樓夢</name><price>35</price><author>曹雪芹</author><detail><pressTime>清朝</pressTime><storyTime>不詳</storyTime></detail></book><book category="神話小說" edition="4"><id>4</id><name>西游記</name><price>25</price><author>吳承恩</author><detail><pressTime>明朝</pressTime><storyTime>大唐</storyTime></detail></book><book category="小說" edition="5"><id>5</id><name>水滸傳</name><price>30</price><author>施耐庵</author><detail><pressTime>明朝</pressTime><storyTime>大宋</storyTime></detail></book> </books>

1.把所有的edition屬性的值為8的修改為100
使用xpath查找對象時,依賴于jaxen.jar包,所以要先下載這個包。查找對象時,如果查找的是節點,直接寫名稱,如:/books/book/name,如果查找的是屬性,要在屬性前加上@,如:/books/book/@edition

@Testpublic void modifyXmlFile(){try {SAXReader reader = new SAXReader();Document document = reader.read(new File("F:\\test\\books.xml"));//先利用xpath查找對象List<Node> ns = document.selectNodes("/books/book/@edition");Iterator<Node> iter = ns.iterator();while(iter.hasNext()){Attribute attr = (Attribute) iter.next();if(Integer.parseInt(attr.getValue())==8){attr.setValue("100");}}//輸出修改后的文件PrintWriter out = new PrintWriter(new File("F:\\test\\m1.xml"));XMLWriter w = new XMLWriter(out,OutputFormat.createPrettyPrint());w.write(document);w.close();} catch (DocumentException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} }

2.把“Java編程思想”修改為“Java語言程序設計”并在該name屬性所在的book節點中添加buyTime節點,節點值為2015-04-27:

@Testpublic void modifyXmlFile(){try {SAXReader reader = new SAXReader();Document document = reader.read(new File("F:\\test\\books.xml"));//先利用xpath查找對象List<Node> ns = document.selectNodes("/books/book/name");Iterator<Node> iter = ns.iterator();while(iter.hasNext()){Element e = (Element) iter.next();if(e.getText().equals("Java編程思想")){e.setText("Java語言程序設計");Element pe = e.getParent();Element new_e = pe.addElement("buyTime");new_e.setText("2015-04-27");}}//輸出修改后的文件PrintWriter out = new PrintWriter(new File("F:\\test\\m2.xml"));XMLWriter w = new XMLWriter(out,OutputFormat.createPrettyPrint());w.write(document);w.close();} catch (DocumentException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} }

3.若edition屬性值為8,則刪除該屬性

@Testpublic void modifyXmlFile(){try {SAXReader reader = new SAXReader();Document document = reader.read(new File("F:\\test\\books.xml"));List<Node> ns = document.selectNodes("/books/book/@edition");Iterator<Node> iter = ns.iterator();while(iter.hasNext()){Attribute attr = (Attribute) iter.next();if(Integer.parseInt(attr.getValue())==8){attr.getParent().remove(attr);}}try {PrintWriter out = new PrintWriter(new File("F:\\test\\m3.xml"));XMLWriter w = new XMLWriter(out,OutputFormat.createPrettyPrint());w.write(document);w.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} catch (DocumentException e) {e.printStackTrace();}}

4.把id為3的書的name節點刪除:

@Test public void modifyXmlFile(){try {SAXReader reader = new SAXReader();Document document = reader.read(new File("F:\\test\\books.xml"));List<Node> ns = document.selectNodes("/books/book/id");Iterator<Node> iter = ns.iterator();while(iter.hasNext()){Element e = (Element) iter.next();if(e.getText().equals("3")){e.getParent().remove(e.getParent().element("name"));}}PrintWriter out = new PrintWriter(new File("F:\\test\\m4.xml"));XMLWriter w = new XMLWriter(out, OutputFormat.createPrettyPrint());w.write(document);w.close();} catch (DocumentException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

5.移除所有文件的id屬性:

方式一:
直接查找id節點,再刪除

@Testpublic void modifyXmlFile(){try {SAXReader reader = new SAXReader();Document document = reader.read(new File("F:\\test\\books.xml"));List<Node> ns = document.selectNodes("/books/book/id");Iterator<Node> iter = ns.iterator();while(iter.hasNext()){Element e = (Element) iter.next();e.getParent().remove(e);}PrintWriter out = new PrintWriter(new File("F:\\test\\m5.xml"));XMLWriter w = new XMLWriter(out,OutputFormat.createPrettyPrint());w.write(document);w.close();} catch (DocumentException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

方法二:
查找book節點,再刪除book節點的id節點:

@Testpublic void modifyXmlFile(){try {SAXReader reader = new SAXReader();Document document = reader.read(new File("F:\\test\\books.xml"));List<Node> ns = document.selectNodes("/books/book");Iterator<Node> iter = ns.iterator();while(iter.hasNext()){Element e = (Element) iter.next();e.remove(e.element("id"));}PrintWriter out = new PrintWriter(new File("F:\\test\\m6.xml"));XMLWriter w = new XMLWriter(out,OutputFormat.createPrettyPrint());w.write(document);w.close();} catch (DocumentException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

好了,先寫這么多,這些東東基本上夠項目使用了。

轉載于:https://www.cnblogs.com/qitian1/p/6461875.html

總結

以上是生活随笔為你收集整理的Dom4j 学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。