日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

DOM4J解析XML文档、Document对象、节点对象节点对象属性、将文档写入XML文件(详细)...

發布時間:2025/7/25 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DOM4J解析XML文档、Document对象、节点对象节点对象属性、将文档写入XML文件(详细)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Dom4j是一個簡單、靈活的開放源代碼的庫。Dom4j是由早期開發JDOM開發的。與JDOM不同的是,dom4j使用接口和抽象的人分離出來而后獨立基類,雖然Dom4j的API相對要復雜一些,但它提供了比JDOM更好的靈活性。?

Dom4j是一個非常優秀的Java?XML?API,具有性能優異、功能強大和極易使用的特點。現在很多軟件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。

使用Dom4j開發,需下載dom4j相應的jar文件。

Document對象

DOM4j中,獲得Document對象的方式有三種:

1.讀取XML文件,獲得document對象????????????

???????????????????SAXReader?reader?=?new?SAXReader();
??????????????Document???document?=?reader.read(new?File("input.xml"));

2.解析XML形式的文本,得到document對象.

???????????????????String?text?=?"<members></members>";
??????????????Document?document?=?DocumentHelper.parseText(text);

3.主動創建document對象.

??????????????????Document?document?=?DocumentHelper.createDocument();
?????????????//創建根節點

??????????????????Element?root?=?document.addElement("members");

節點對象

1.獲取文檔的根節點.

??????Element?root?=?document.getRootElement();

2.取得某個節點的子節點.

Element?element=node.element(“書名");

3.取得節點的文字

??????String?text=node.getText();

4.取得某節點下所有名為“member”的子節點,并進行遍歷.
?List?nodes?=?rootElm.elements("member");
?
??for?(Iterator?it?=?nodes.iterator();?it.hasNext();)?{
?????Element?elm?=?(Element)?it.next();
????//?do?something
?}

5.對某節點下的所有子節點進行遍歷.
????for(Iterator?it=root.elementIterator();it.hasNext();){
???????Element?element?=?(Element)?it.next();
???????//?do?something
????}

6.在某節點下添加子節點.
Element?ageElm?=?newMemberElm.addElement("age");

7.設置節點文字.
?element.setText("29");

8.刪除某節點.
//childElm是待刪除的節點,parentElm是其父節點

????parentElm.remove(childElm);

9.添加一個CDATA節點.
Element?contentElm?=?infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());

節點對象屬性

1.取得某節點下的某屬性
????Element?root=document.getRootElement();????
????//屬性名name

?????????Attribute?attribute=root.attribute("size");

2.取得屬性的文字
????String?text=attribute.getText();

?3.刪除某屬性
?Attribute?attribute=root.attribute("size");
?root.remove(attribute);

3.遍歷某節點的所有屬性
???Element?root=document.getRootElement();????
???for(Iterator?it=root.attributeIterator();it.hasNext();){
?????????Attribute?attribute?=?(Attribute)?it.next();
?????????String?text=attribute.getText();
?????????System.out.println(text);
????}

4.設置某節點的屬性和文字.
???newMemberElm.addAttribute("name",?"sitinspring");

5.設置屬性的文字
???Attribute?attribute=root.attribute("name");
???attribute.setText("sitinspring");

將文檔寫入XML文件.

1.文檔中全為英文,不設置編碼,直接寫入的形式.
??XMLWriter?writer?=?new?XMLWriter(new??FileWriter("output.xml"));
??writer.write(document);
??writer.close();

2.文檔中含有中文,設置編碼格式寫入的形式.
OutputFormat?format?=?OutputFormat.createPrettyPrint();
//?指定XML編碼???????????????????

?????format.setEncoding("GBK");???????
XMLWriter?writer?=?new?XMLWriter(newFileWriter("output.xml"),format);
writer.write(document);
writer.close();

Dom4j在指定位置插入節點

1.得到插入位置的節點列表(list)

2.調用list.add(index,elemnent),由index決定element的插入位置。

Element元素可以通過DocumentHelper對象得到。示例代碼:

Element?aaa?=?DocumentHelper.createElement("aaa");

aaa.setText("aaa");

List?list?=?root.element("書").elements();

list.add(1,?aaa);

//更新document

字符串與XML的轉換?

1.將字符串轉化為XML
?

?????String?text?=?"<members>?<member>sitinspring</member></members>";
Document?document?=?DocumentHelper.parseText(text);

2.將文檔或節點的XML轉化為字符串.

?????SAXReader?reader?=?new?SAXReader();
Document???document?=?reader.read(new?File("input.xml"));????????????
Element?root=document.getRootElement();????

????????????
String?docXmlText=document.asXML();

String?rootXmlText=root.asXML();
Element?memberElm=root.element("member");
String?memberXmlText=memberElm.asXML();
續寫

dom4j是一個Java的XML API,類似于jdom,用來讀寫XML文件的。

下載(環境配置)

DOM4J是開源組織提供的一個免費的、強大的XML解析工具,如果開發者需要在項目中使用那么需要下載并引入jar包。

1. 下載DOM4J地址:http://sourceforge.net/projects/dom4j

2.?引入:dom4j-1.6.1.jar (核心包)、 jaxen-1.1-beta-6.jar(Xpath支持包)

方法

它的主要方法都在org.dom4j這個包里定義:
AttributeAttribute定義了XML的屬性
BranchBranch為能夠包含子節點的節點如XML元素(Element)和文檔(Docuemnts)定義了一個公共的行為,
CDATACDATA 定義了XML CDATA 區域
CharacterDataCharacterData是一個標識借口,標識基于字符的節點。如CDATA,Comment, Text.
CommentComment 定義了XML注釋的行為
Document定義了XML文檔
DocumentTypeDocumentType 定義XML DOCTYPE聲明
ElementElement定義XML 元素
ElementHandlerElementHandler定義了 Element 對象的處理器
ElementPath被?ElementHandler?使用,用于取得當前正在處理的路徑層次信息
EntityEntity定義 XML entity
NodeNode為所有的dom4j中XML節點定義了多態行為
NodeFilterNodeFilter 定義了在dom4j節點中產生的一個濾鏡或謂詞的行為(predicate)
ProcessingInstructionProcessingInstruction 定義 XML 處理指令.
TextText 定義XML 文本節點.
VisitorVisitor 用于實現Visitor模式.
XPathXPath 在分析一個字符串后會提供一個XPath 表達式

繼承關系

要想弄懂這套接口,關鍵的是要明白接口的繼承關系:
  • interface java.lang.Cloneable
    • interface org.dom4j.Node
    • interface org.dom4j.Attribute
    • interface org.dom4j.Branch
      • interface org.dom4j.Document
      • interface org.dom4j.Element
    • interface org.dom4j.CharacterData
      • interface org.dom4j.CDATA
      • interface org.dom4j.Comment
      • interface org.dom4j.Text
    • interface org.dom4j.DocumentType
    • interface org.dom4j.Entity
    • interface org.dom4j.ProcessingInstruction

主要JAVA包

Document對象

1.讀取XML文件,獲得document對象. ?

SAXReader reader = new SAXReader(); ?? Document ? document = reader.read(new File("input.xml")); ??

2.解析XML形式的文本,得到document對象. ??

String text = "<members></members>"; ?? Document document = DocumentHelper.parseText(text); ??

3.主動創建document對象. ??

Document document = DocumentHelper.createDocument(); ?? Element root = document.addElement("members");// 創建根節點 ??

Element節點

1.獲取文檔的根節點. ??
Element rootElm = document.getRootElement(); ??
2.取得某節點的單個子節點. ??

Element memberElm=root.element("member");// "member"是節點名 ??

3.取得節點的文字 ??

String text=memberElm.getText();也可以用: ??
String text=root.elementText("name");這個是取得根節點下的name字節點的文字. ??

4.取得某節點下名為"member"的所有字節點并進行遍歷. ??

List nodes = rootElm.elements("member"); ??
for (Iterator it = nodes.iterator(); it.hasNext();) { ??
? Element elm = (Element) it.next(); ??
? // do something ??
} ??

5.對某節點下的所有子節點進行遍歷. ??

for(Iterator it=root.elementIterator();it.hasNext();){ ??
? Element element = (Element) it.next(); ??
? ?// do something ??
} ??

6.在某節點下添加子節點. ??

Element ageElm = newMemberElm.addElement("age"); ??

7.設置節點文字. ??

ageElm.setText("29"); ??

8.刪除某節點. ??

parentElm.remove(childElm);// childElm是待刪除的節點,parentElm是其父節點 ??

9.添加一個CDATA節點. ??

Element contentElm = infoElm.addElement("content"); ??
contentElm.addCDATA(diary.getContent()); ?

Attribute屬性

1.取得某節點下的某屬性 ??

Element root=document.getRootElement(); ? ? ??
Attribute attribute=root.attribute("size");// 屬性名name

2.取得屬性的文字 ??

// 也可以用
String text=attribute.getText(); ??
// ?這個是取得根節點下name字節點的屬性firstname的值: ?
String text2=root.element("name").attributeValue("firstname");

3.遍歷某節點的所有屬性 ? ?

Element root=document.getRootElement(); ? ? ? ?
for(Iterator it=root.attributeIterator();it.hasNext();){ ? ?
?Attribute attribute = (Attribute) it.next(); ? ?
?String text=attribute.getText(); ? ?
?System.out.println(text); ? ?
}

4.設置某節點的屬性和文字. ? ?

newMemberElm.addAttribute("name", "sitinspring"); ? ?

5.設置屬性的文字 ??

Attribute attribute=root.attribute("name"); ? ?
attribute.setText("sitinspring"); ? ?

6.刪除某屬性 ? ?

Attribute attribute=root.attribute("size");// 屬性名name ? ?
root.remove(attribute); ? ?

解析步驟

1. 準備需要解析的xml文件linkmans.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <linkmans><linkman><name>jack</name><phone>18663243245</phone><email>jack@163.com</email></linkman><linkman><name>張三</name><phone>1353243247</phone><email>zs@126.com</email></linkman> </linkmans>

2. 獲取解析器

public static SAXReader getReader() {return new SAXReader(); }

3. 獲取解析對象

public static Document getDocument(File file) throws Exception {// 3.1獲取解析器SAXReader reader = getReader();// 3.2解析文檔Document doc = reader.read(file);return doc; }

4. 獲取根元素節點

public static void getRoot(File file) throws Exception {// 4.1獲取解析器SAXReader reader = getReader();// 4.2解析文檔Document doc = reader.read(file);// 4.3獲取根元素Element root = doc.getRootElement();System.out.println(root.getName()); }

5. 獲取指定的其他的元素

public static void getElement(File file) throws Exception {// 5.1獲取解析器SAXReader reader = getReader();// 5.2解析文檔Document doc = reader.read(file);// 5.3獲取根元素Element root = doc.getRootElement();// 5.4獲取所有的linkmanList list = root.elements("linkman");Iterator it = list.iterator();// 5.5循環遍歷節點while (it.hasNext()) {Element ele = (Element) it.next();System.out.println(ele.getName());}System.out.println("---------------");// 簡化for (Iterator i = root.elementIterator(); i.hasNext();) {Element element = (Element) i.next();System.out.println(element.getName());}// 5.6獲取第二個linkman的名字Element linkman2 = (Element) list.get(1);String name = linkman2.element("name").getText();System.out.println(name); }

6. 添加元素

public static Document addElement(File file) throws Exception {// 6.1獲取解析器SAXReader reader = getReader();// 6.2解析文檔Document doc = reader.read(file);// 6.3獲取根元素Element root = doc.getRootElement();// 6.4創建新元素Element new_linkman = DocumentHelper.createElement("linkman");Element new_name = DocumentHelper.createElement("name");Element new_phone = DocumentHelper.createElement("phone");Element new_email = DocumentHelper.createElement("email");new_name.setText("焦寧波");new_phone.setText("186xxxxxxxxx");new_email.setText("jnb@itcast.cn");// 6.5建立關系new_linkman.add(new_name);new_linkman.add(new_phone);new_linkman.add(new_email);root.add(new_linkman);return doc; }

7. 修改的document需要進行持久化的操作,因此需要提供以下的方法。

public static void writeDocument2XML(Document doc, File file) throws Exception {// 創建創建一個轉換對象XMLWriter writer = new XMLWriter(// 可以解決輸入的數據時中文的亂碼問題new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));// 將doc寫入指定文件writer.write(doc);// 釋放資源writer.close(); }

8. 修改元素

public static Document modifyElement(File file) throws Exception {// 8.1獲取解析器SAXReader reader = getReader();// 8.2解析文檔Document doc = reader.read(file);// 8.3獲取根元素Element root = doc.getRootElement();// 8.4直接獲取第二個linkman的nameElement name = ((Element) root.elements("linkman").get(1)).element("name");name.setText("李四");return doc; }

9. 刪除元素

public static Document removeAll(File file) throws Exception {// 9.1獲取解析器SAXReader reader = getReader();// 9.2解析文檔Document doc = reader.read(file);// 9.3獲取根元素Element root = doc.getRootElement();// 9.4獲取所有的linkmanList list = root.elements("linkman");// 9.4循環斷絕關系for (Object temp: list) {// 轉型Element linkman = (Element) temp;// 斷絕關系root.remove(linkman);}return doc; }

10. 屬性的操作

public static Document optionAttribute(File file) throws Exception {// 10.1獲取解析器SAXReader reader = getReader();// 10.2解析文檔Document doc = reader.read(file);// 10.3獲取根元素Element root = doc.getRootElement();// 10.4獲取所有的linkmanList list = root.elements("linkman");// 10.4循環添加屬性int count = 0;for (Object temp: list) {// 轉型Element linkman = (Element) temp;// 添加屬性linkman.add(DocumentHelper.createAttribute(linkman, "id", "00" + (count + 1)));count++;}// 10.5獲取焦寧波的idElement linkman3 = (Element) list.get(2);String value = linkman3.attribute("id").getText();System.out.println(value);// 10.6修改屬性linkman3.attribute("id").setText("007");// 10.7刪除屬性linkman3.remove(linkman3.attribute("id"));return doc; }

11.

? ? ? Element rootElement = document.getRootElement(); //獲取文檔的根節點<Package>/<Package>
? ? ?Element element = rootElement.element("RequestNodes");//獲取父節點(RequestNodes)
? ? ?List elements = element.elements("RequestNode"); //獲取所有的 RequestNode節點

? ? ? Iterator it = elements.iterator();
? ? ?while (it.hasNext()) {
? ? ?Element ele = (Element) it.next();
? ? ?Element elementZipCode= ele.element("ZipCode");//獲取到每個郵編節點
? ? ?String text = elementZipCode.getText();//郵編得的值

}

? ?例子:xml??

?xml version="1.0" encoding="GBK"?>
<Package>
<Head>
<TransDate>2017-05-12</TransDate>
<TransTime>15:27:05</TransTime>
<TransName>PR*****</TransName>
</Head>
<RequestNodes>
<RequestNode>
<AppntName>*****</AppntName>
<ZipCode>20*****</ZipCode>
<Address>*****</Address>
<ContNo>2016051100111486</ContNo>
<CValiDate>2016-05-12</CValiDate>
<PaytoDate>2017-05-12</PaytoDate>
<InsuredName>王麗</InsuredName>
<AgentName>功夫熊貓</AgentName>
<Phone>1******838738</Phone>
<PayMode>*****</PayMode>
<HLPrem>0.00</HLPrem>
<Risks>
<Risk>
<RiskName>*********</RiskName>
<Premium>10000.00</Premium>
<SubRiskFlag>M</SubRiskFlag>
</Risk>
</Risks>
<BankCode>*****</BankCode>
<AccType>******</AccType>
<BankAccNo>***************0799</BankAccNo>
<SumPremium>1*****0.00</SumPremium>
<ComAddress>*****</ComAddress>
<NoticeNo>500*****00*****32</NoticeNo>
<PrintDate>*****-05-12</PrintDate>
</RequestNode>
</RequestNodes>
</Package>

例子

//需要解析的emplist.xml <?xml version="1.0" encoding="utf-8"?> <list>?<emp id="1">?<name>張三</name> ?<age>34</age> ?<gender>男</gender> ?<salary>3000</salary>?</emp> ?<emp id="2">?<name>李四</name> ?<age>14</age> ?<gender>女</gender> ?<salary>4000</salary>?</emp> ?<emp id="3">?<name>王五</name> ?<age>14</age> ?<gender>女</gender> ?<salary>50000</salary>?</emp> ?<emp id="4">?<name>趙六</name> ?<age>29</age> ?<gender>男</gender> ?<salary>300</salary>?</emp> ?<emp id="5">?<name>錢7</name> ?<age>53</age> ?<gender>男</gender> ?<salary>12000</salary>?</emp>? </list> /*** 該類用于表示emplist.xml文檔中的一個emp數據*/ public class Emp {private int id;private String name;private int age;private String gender;private int salary;public Emp(){}public Emp(int id, String name, int age, String gender, int salary) {super();this.id = id;this.name = name;this.age = age;this.gender = gender;this.salary = salary;}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 getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}public String toString(){return ?id+","+name+","+age+","+gender+","+salary;} } /*** 使用DOM解析XML文檔*/ public class ParseXmlDemo {public static void main(String[] args) {try {/*** 解析大致步驟:* 1:創建SAXReader* 2:使用SAXReader解析指定的xml文檔信息,并返回對應Document對象* ? ? ?Document對象中就包含了該XML文檔中的所有信息及結構了。* 3:根據文檔結構將xml描述的樹狀信息讀取到。*///1:SAXReader reader = new SAXReader();/*** 2:解析xml工作在這里就進行完畢了*?*/Document doc = ? ?reader.read(new File("emplist.xml"));//3List<Emp> list = new ArrayList<Emp>();/*** 解析第一步,獲取根標簽(根元素)* Document提供了一個可以獲取根元素的方法;* Element getRootElement();* Element 的每一個實例表示xml文檔中一對標簽。這里獲取的根標簽就相當于是* <list>....</list>那對標簽。*/Element root =doc.getRootElement();/*** 由于xml文檔中一個標簽可能含有其他子標簽* 所以Element對象提供了可以獲取其表示的標簽中的子標簽的方法:* List elment()* 獲取當期標簽下所有子標簽,List集合中存放的是若干個Element實例,* 每個實例表示其中一個子標簽。*?* List elements(String name)* 獲取當前標簽下所有同名(參數指定該名字)子標簽*?* ?Element element(String name)* ?獲取當前標簽下給定名字的標簽,若有多個,獲取第一個。*/List<Element> ?elementlist = root.elements("emp");//遍歷每一個<emp>標簽for(Element empEle: elementlist){//獲取name的值Element nameEle = empEle.element("name");/*** String getText() ?獲取當前標簽中間的文本(字符串)* getTextTrim() ?去空白。。*/String name =nameEle.getText();Element ageEle =empEle.element("age");int ?age = Integer.parseInt(ageEle.getText());/*** String elmentText(String name)* 獲取當前標簽下給定名字的子標簽中間的文本,這個方法等同于上面獲取name中間文本的兩句代碼。*/String gender =empEle.elementText("gender");int salary=Integer.parseInt(empEle.elementText("salary"));/*** Element 還提供了可以用來獲取其描述的標簽中的屬性信息:* Attribute attribute(String name)* 該方法可以獲取給定名字的屬性,Attribute的每一個實例都可以表示一個標簽中的一個屬性。*/Attribute attr =empEle.attribute("id");int id =Integer.parseInt(attr.getValue());Emp emp = new Emp(id,name,age,gender,salary);list.add(emp);}System.out.println("解析完畢!");for(Emp e :list){System.out.println(e);}} catch (Exception e) {e.printStackTrace();}} }

運行結果:

解析完畢! 1,張三,34,男,3000 2,李四,14,女,4000 3,王五,14,女,50000 4,趙六,29,男,300 5,錢7,53,男,12000

總結

1. dom4j是一個易用的、開源的庫,用于XML,XPath和XSLT。它應用于Java平臺,采用了Java集合框架并完全支持DOM,SAX和JAXP。

2. dom4j是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件,現在越來越多的Java軟件都在使用dom4j來讀寫XML,特別值得一提的是連Sun的JAXM也在用dom4j。

?

轉載于:https://www.cnblogs.com/ysySelf/p/10186322.html

總結

以上是生活随笔為你收集整理的DOM4J解析XML文档、Document对象、节点对象节点对象属性、将文档写入XML文件(详细)...的全部內容,希望文章能夠幫你解決所遇到的問題。

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