DOM4J解析XML文档、Document对象、节点对象节点对象属性、将文档写入XML文件(详细)...
Dom4j是一個(gè)簡(jiǎn)單、靈活的開放源代碼的庫(kù)。Dom4j是由早期開發(fā)JDOM開發(fā)的。與JDOM不同的是,dom4j使用接口和抽象的人分離出來(lái)而后獨(dú)立基類,雖然Dom4j的API相對(duì)要復(fù)雜一些,但它提供了比JDOM更好的靈活性。?
Dom4j是一個(gè)非常優(yōu)秀的Java?XML?API,具有性能優(yōu)異、功能強(qiáng)大和極易使用的特點(diǎn)。現(xiàn)在很多軟件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
使用Dom4j開發(fā),需下載dom4j相應(yīng)的jar文件。
Document對(duì)象
DOM4j中,獲得Document對(duì)象的方式有三種:
1.讀取XML文件,獲得document對(duì)象????????????
???????????????????SAXReader?reader?=?new?SAXReader();
??????????????Document???document?=?reader.read(new?File("input.xml"));
2.解析XML形式的文本,得到document對(duì)象.
???????????????????String?text?=?"<members></members>";
??????????????Document?document?=?DocumentHelper.parseText(text);
3.主動(dòng)創(chuàng)建document對(duì)象.
??????????????????Document?document?=?DocumentHelper.createDocument();
?????????????//創(chuàng)建根節(jié)點(diǎn)
??????????????????Element?root?=?document.addElement("members");
節(jié)點(diǎn)對(duì)象
1.獲取文檔的根節(jié)點(diǎn).
??????Element?root?=?document.getRootElement();
2.取得某個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn).
Element?element=node.element(“書名");
3.取得節(jié)點(diǎn)的文字
??????String?text=node.getText();
4.取得某節(jié)點(diǎn)下所有名為“member”的子節(jié)點(diǎn),并進(jìn)行遍歷.
?List?nodes?=?rootElm.elements("member");
?
??for?(Iterator?it?=?nodes.iterator();?it.hasNext();)?{
?????Element?elm?=?(Element)?it.next();
????//?do?something
?}
5.對(duì)某節(jié)點(diǎn)下的所有子節(jié)點(diǎn)進(jìn)行遍歷.
????for(Iterator?it=root.elementIterator();it.hasNext();){
???????Element?element?=?(Element)?it.next();
???????//?do?something
????}
6.在某節(jié)點(diǎn)下添加子節(jié)點(diǎn).
Element?ageElm?=?newMemberElm.addElement("age");
7.設(shè)置節(jié)點(diǎn)文字.
?element.setText("29");
8.刪除某節(jié)點(diǎn).
//childElm是待刪除的節(jié)點(diǎn),parentElm是其父節(jié)點(diǎn)
????parentElm.remove(childElm);
9.添加一個(gè)CDATA節(jié)點(diǎn).
Element?contentElm?=?infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());
節(jié)點(diǎn)對(duì)象屬性
1.取得某節(jié)點(diǎn)下的某屬性
????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.遍歷某節(jié)點(diǎn)的所有屬性
???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.設(shè)置某節(jié)點(diǎn)的屬性和文字.
???newMemberElm.addAttribute("name",?"sitinspring");
5.設(shè)置屬性的文字
???Attribute?attribute=root.attribute("name");
???attribute.setText("sitinspring");
將文檔寫入XML文件.
1.文檔中全為英文,不設(shè)置編碼,直接寫入的形式.
??XMLWriter?writer?=?new?XMLWriter(new??FileWriter("output.xml"));
??writer.write(document);
??writer.close();
2.文檔中含有中文,設(shè)置編碼格式寫入的形式.
OutputFormat?format?=?OutputFormat.createPrettyPrint();
//?指定XML編碼???????????????????
?????format.setEncoding("GBK");???????
XMLWriter?writer?=?new?XMLWriter(newFileWriter("output.xml"),format);
writer.write(document);
writer.close();
Dom4j在指定位置插入節(jié)點(diǎn)
1.得到插入位置的節(jié)點(diǎn)列表(list)
2.調(diào)用list.add(index,elemnent),由index決定element的插入位置。
Element元素可以通過(guò)DocumentHelper對(duì)象得到。示例代碼:
Element?aaa?=?DocumentHelper.createElement("aaa");
aaa.setText("aaa");
List?list?=?root.element("書").elements();
list.add(1,?aaa);
//更新document
字符串與XML的轉(zhuǎn)換?
1.將字符串轉(zhuǎn)化為XML
?
?????String?text?=?"<members>?<member>sitinspring</member></members>";
Document?document?=?DocumentHelper.parseText(text);
2.將文檔或節(jié)點(diǎn)的XML轉(zhuǎn)化為字符串.
?????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();
續(xù)寫
dom4j是一個(gè)Java的XML API,類似于jdom,用來(lái)讀寫XML文件的。
下載(環(huán)境配置)
DOM4J是開源組織提供的一個(gè)免費(fèi)的、強(qiáng)大的XML解析工具,如果開發(fā)者需要在項(xiàng)目中使用那么需要下載并引入jar包。
1. 下載DOM4J地址:http://sourceforge.net/projects/dom4j
2.?引入:dom4j-1.6.1.jar (核心包)、 jaxen-1.1-beta-6.jar(Xpath支持包)
方法
它的主要方法都在org.dom4j這個(gè)包里定義:| Attribute | Attribute定義了XML的屬性 |
| Branch | Branch為能夠包含子節(jié)點(diǎn)的節(jié)點(diǎn)如XML元素(Element)和文檔(Docuemnts)定義了一個(gè)公共的行為, |
| CDATA | CDATA 定義了XML CDATA 區(qū)域 |
| CharacterData | CharacterData是一個(gè)標(biāo)識(shí)借口,標(biāo)識(shí)基于字符的節(jié)點(diǎn)。如CDATA,Comment, Text. |
| Comment | Comment 定義了XML注釋的行為 |
| Document | 定義了XML文檔 |
| DocumentType | DocumentType 定義XML DOCTYPE聲明 |
| Element | Element定義XML 元素 |
| ElementHandler | ElementHandler定義了 Element 對(duì)象的處理器 |
| ElementPath | 被?ElementHandler?使用,用于取得當(dāng)前正在處理的路徑層次信息 |
| Entity | Entity定義 XML entity |
| Node | Node為所有的dom4j中XML節(jié)點(diǎn)定義了多態(tài)行為 |
| NodeFilter | NodeFilter 定義了在dom4j節(jié)點(diǎn)中產(chǎn)生的一個(gè)濾鏡或謂詞的行為(predicate) |
| ProcessingInstruction | ProcessingInstruction 定義 XML 處理指令. |
| Text | Text 定義XML 文本節(jié)點(diǎn). |
| Visitor | Visitor 用于實(shí)現(xiàn)Visitor模式. |
| XPath | XPath 在分析一個(gè)字符串后會(huì)提供一個(gè)XPath 表達(dá)式 |
繼承關(guān)系
要想弄懂這套接口,關(guān)鍵的是要明白接口的繼承關(guān)系:- 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對(duì)象
1.讀取XML文件,獲得document對(duì)象. ?
SAXReader reader = new SAXReader(); ?? Document ? document = reader.read(new File("input.xml")); ??2.解析XML形式的文本,得到document對(duì)象. ??
String text = "<members></members>"; ?? Document document = DocumentHelper.parseText(text); ??3.主動(dòng)創(chuàng)建document對(duì)象. ??
Document document = DocumentHelper.createDocument(); ?? Element root = document.addElement("members");// 創(chuàng)建根節(jié)點(diǎn) ??Element節(jié)點(diǎn)
1.獲取文檔的根節(jié)點(diǎn). ??
Element rootElm = document.getRootElement(); ??
2.取得某節(jié)點(diǎn)的單個(gè)子節(jié)點(diǎn). ??
Element memberElm=root.element("member");// "member"是節(jié)點(diǎn)名 ??
3.取得節(jié)點(diǎn)的文字 ??
String text=memberElm.getText();也可以用: ??
String text=root.elementText("name");這個(gè)是取得根節(jié)點(diǎn)下的name字節(jié)點(diǎn)的文字. ??
4.取得某節(jié)點(diǎn)下名為"member"的所有字節(jié)點(diǎn)并進(jìn)行遍歷. ??
List nodes = rootElm.elements("member"); ??
for (Iterator it = nodes.iterator(); it.hasNext();) { ??
? Element elm = (Element) it.next(); ??
? // do something ??
} ??
5.對(duì)某節(jié)點(diǎn)下的所有子節(jié)點(diǎn)進(jìn)行遍歷. ??
for(Iterator it=root.elementIterator();it.hasNext();){ ??
? Element element = (Element) it.next(); ??
? ?// do something ??
} ??
6.在某節(jié)點(diǎn)下添加子節(jié)點(diǎn). ??
Element ageElm = newMemberElm.addElement("age"); ??
7.設(shè)置節(jié)點(diǎn)文字. ??
ageElm.setText("29"); ??
8.刪除某節(jié)點(diǎn). ??
parentElm.remove(childElm);// childElm是待刪除的節(jié)點(diǎn),parentElm是其父節(jié)點(diǎn) ??
9.添加一個(gè)CDATA節(jié)點(diǎn). ??
Element contentElm = infoElm.addElement("content"); ??
contentElm.addCDATA(diary.getContent()); ?
Attribute屬性
1.取得某節(jié)點(diǎn)下的某屬性 ??
Element root=document.getRootElement(); ? ? ??
Attribute attribute=root.attribute("size");// 屬性名name
2.取得屬性的文字 ??
// 也可以用
String text=attribute.getText(); ??
// ?這個(gè)是取得根節(jié)點(diǎn)下name字節(jié)點(diǎn)的屬性firstname的值: ?
String text2=root.element("name").attributeValue("firstname");
3.遍歷某節(jié)點(diǎn)的所有屬性 ? ?
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.設(shè)置某節(jié)點(diǎn)的屬性和文字. ? ?
newMemberElm.addAttribute("name", "sitinspring"); ? ?
5.設(shè)置屬性的文字 ??
Attribute attribute=root.attribute("name"); ? ?
attribute.setText("sitinspring"); ? ?
6.刪除某屬性 ? ?
Attribute attribute=root.attribute("size");// 屬性名name ? ?
root.remove(attribute); ? ?
解析步驟
1. 準(zhǔn)備需要解析的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. 獲取解析對(duì)象
public static Document getDocument(File file) throws Exception {// 3.1獲取解析器SAXReader reader = getReader();// 3.2解析文檔Document doc = reader.read(file);return doc; }4. 獲取根元素節(jié)點(diǎn)
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循環(huán)遍歷節(jié)點(diǎn)while (it.hasNext()) {Element ele = (Element) it.next();System.out.println(ele.getName());}System.out.println("---------------");// 簡(jiǎn)化for (Iterator i = root.elementIterator(); i.hasNext();) {Element element = (Element) i.next();System.out.println(element.getName());}// 5.6獲取第二個(gè)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創(chuàng)建新元素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建立關(guān)系new_linkman.add(new_name);new_linkman.add(new_phone);new_linkman.add(new_email);root.add(new_linkman);return doc; }7. 修改的document需要進(jìn)行持久化的操作,因此需要提供以下的方法。
public static void writeDocument2XML(Document doc, File file) throws Exception {// 創(chuàng)建創(chuàng)建一個(gè)轉(zhuǎn)換對(duì)象XMLWriter writer = new XMLWriter(// 可以解決輸入的數(shù)據(jù)時(shí)中文的亂碼問(wèn)題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直接獲取第二個(gè)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循環(huán)斷絕關(guān)系for (Object temp: list) {// 轉(zhuǎn)型Element linkman = (Element) temp;// 斷絕關(guān)系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循環(huán)添加屬性int count = 0;for (Object temp: list) {// 轉(zhuǎn)型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(); //獲取文檔的根節(jié)點(diǎn)<Package>/<Package>
? ? ?Element element = rootElement.element("RequestNodes");//獲取父節(jié)點(diǎn)(RequestNodes)
? ? ?List elements = element.elements("RequestNode"); //獲取所有的 RequestNode節(jié)點(diǎn)
? ? ? Iterator it = elements.iterator();
? ? ?while (it.hasNext()) {
? ? ?Element ele = (Element) it.next();
? ? ?Element elementZipCode= ele.element("ZipCode");//獲取到每個(gè)郵編節(jié)點(diǎn)
? ? ?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文檔中的一個(gè)emp數(shù)據(jù)*/ 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:創(chuàng)建SAXReader* 2:使用SAXReader解析指定的xml文檔信息,并返回對(duì)應(yīng)Document對(duì)象* ? ? ?Document對(duì)象中就包含了該XML文檔中的所有信息及結(jié)構(gòu)了。* 3:根據(jù)文檔結(jié)構(gòu)將xml描述的樹狀信息讀取到。*///1:SAXReader reader = new SAXReader();/*** 2:解析xml工作在這里就進(jìn)行完畢了*?*/Document doc = ? ?reader.read(new File("emplist.xml"));//3List<Emp> list = new ArrayList<Emp>();/*** 解析第一步,獲取根標(biāo)簽(根元素)* Document提供了一個(gè)可以獲取根元素的方法;* Element getRootElement();* Element 的每一個(gè)實(shí)例表示xml文檔中一對(duì)標(biāo)簽。這里獲取的根標(biāo)簽就相當(dāng)于是* <list>....</list>那對(duì)標(biāo)簽。*/Element root =doc.getRootElement();/*** 由于xml文檔中一個(gè)標(biāo)簽可能含有其他子標(biāo)簽* 所以Element對(duì)象提供了可以獲取其表示的標(biāo)簽中的子標(biāo)簽的方法:* List elment()* 獲取當(dāng)期標(biāo)簽下所有子標(biāo)簽,List集合中存放的是若干個(gè)Element實(shí)例,* 每個(gè)實(shí)例表示其中一個(gè)子標(biāo)簽。*?* List elements(String name)* 獲取當(dāng)前標(biāo)簽下所有同名(參數(shù)指定該名字)子標(biāo)簽*?* ?Element element(String name)* ?獲取當(dāng)前標(biāo)簽下給定名字的標(biāo)簽,若有多個(gè),獲取第一個(gè)。*/List<Element> ?elementlist = root.elements("emp");//遍歷每一個(gè)<emp>標(biāo)簽for(Element empEle: elementlist){//獲取name的值Element nameEle = empEle.element("name");/*** String getText() ?獲取當(dāng)前標(biāo)簽中間的文本(字符串)* getTextTrim() ?去空白。。*/String name =nameEle.getText();Element ageEle =empEle.element("age");int ?age = Integer.parseInt(ageEle.getText());/*** String elmentText(String name)* 獲取當(dāng)前標(biāo)簽下給定名字的子標(biāo)簽中間的文本,這個(gè)方法等同于上面獲取name中間文本的兩句代碼。*/String gender =empEle.elementText("gender");int salary=Integer.parseInt(empEle.elementText("salary"));/*** Element 還提供了可以用來(lái)獲取其描述的標(biāo)簽中的屬性信息:* Attribute attribute(String name)* 該方法可以獲取給定名字的屬性,Attribute的每一個(gè)實(shí)例都可以表示一個(gè)標(biāo)簽中的一個(gè)屬性。*/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();}} }運(yùn)行結(jié)果:
解析完畢! 1,張三,34,男,3000 2,李四,14,女,4000 3,王五,14,女,50000 4,趙六,29,男,300 5,錢7,53,男,12000總結(jié)
1. dom4j是一個(gè)易用的、開源的庫(kù),用于XML,XPath和XSLT。它應(yīng)用于Java平臺(tái),采用了Java集合框架并完全支持DOM,SAX和JAXP。
2. dom4j是一個(gè)非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開放源代碼的軟件,現(xiàn)在越來(lái)越多的Java軟件都在使用dom4j來(lái)讀寫XML,特別值得一提的是連Sun的JAXM也在用dom4j。
?
轉(zhuǎn)載于:https://www.cnblogs.com/ysySelf/p/10186322.html
總結(jié)
以上是生活随笔為你收集整理的DOM4J解析XML文档、Document对象、节点对象节点对象属性、将文档写入XML文件(详细)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据库之存储引擎,数据类型-30
- 下一篇: 自定义全局样式