我們希望在上面的XML文件中加入一個(gè)新的link節(jié)點(diǎn),因而首先還是要讀入links.xml文件,構(gòu)建一個(gè)DOM樹,然后再對這個(gè)DOM樹進(jìn)行修改(添加節(jié)點(diǎn)),最后把修改后的DOM寫回到links.xml文件中:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc=builder.parse("links.xml");
doc.normalize();
//---取得變量----
String text="Hanzhong's Homepage";
String url="www.hzliu.com";
String author="Hzliu Liu";
String discription="A site from Hanzhong Liu, give u lots of suprise!!!";
為了看清重點(diǎn),簡化程序,我們把要加入的內(nèi)容硬編碼到記憶String對象中,而實(shí)際操作中,往往利用一個(gè)界面來提取用戶輸入,或者通過JDBC從數(shù)據(jù)庫中提取想要的內(nèi)容。
Text textseg;
Element link=doc.createElement("link");
首先應(yīng)該明了的是,無論什么類型的Node,Text型的也好,Attr型的也好,Element型的也好,它們的創(chuàng)建都是通過Document對象中的createXXX()方法來創(chuàng)建的(XXX代表具體要?jiǎng)?chuàng)建的類型),因此,我們要向XML文檔中添加一個(gè)link項(xiàng)目,首先要?jiǎng)?chuàng)建一個(gè)link對象:
Element linktext=doc.createElement("text");
textseg=doc.createTextNode(text);
linktext.appendChild(textseg);
link.appendChild(linktext);
Element linkurl=doc.createElement("url");
textseg=doc.createTextNode(url);
linkurl.appendChild(textseg);
link.appendChild(linkurl);
Element linkauthor=doc.createElement("author");
textseg=doc.createTextNode(author);
linkauthor.appendChild(textseg);
link.appendChild(linkauthor);
java.util.Calendar rightNow = java.util.Calendar.getInstance();
String day=Integer.toString(rightNow.get(java.util.Calendar.DAY_OF_MONTH));
String month=Integer.toString(rightNow.get(java.util.Calendar.MONTH));
String year=Integer.toString(rightNow.get(java.util.Calendar.YEAR));
Element linkdate=doc.createElement("date");
Element linkdateday=doc.createElement("day");
textseg=doc.createTextNode(day);
linkdateday.appendChild(textseg);
Element linkdatemonth=doc.createElement("month");
textseg=doc.createTextNode(month);
linkdatemonth.appendChild(textseg);
Element linkdateyear=doc.createElement("year");
textseg=doc.createTextNode(year);
linkdateyear.appendChild(textseg);
linkdate.appendChild(linkdateday);
linkdate.appendChild(linkdatemonth);
linkdate.appendChild(linkdateyear);
link.appendChild(linkdate);
Element linkdiscription=doc.createElement("description");
textseg=doc.createTextNode(discription);
linkdiscription.appendChild(textseg);
link.appendChild(linkdiscription);
創(chuàng)建節(jié)點(diǎn)的過程可能有些千篇一律,但需要注意的地方是,對Element中所包含的text(在DOM中,這些text也是代表了一個(gè)Node的,因此也必須為它們創(chuàng)建相應(yīng)的node),不能直接用Element對象的setNodeValue()方法來設(shè)置這些text的內(nèi)容,而需要用創(chuàng)建的Text對象的setNodeValue()方法來設(shè)置文本,這樣才能夠把創(chuàng)建的Element和其文本內(nèi)容添加到DOM樹中?纯辞懊娴拇a,你會(huì)更好的理解這一點(diǎn):
doc.getDocumentElement().appendChild(link);
最后,不要忘記把創(chuàng)建好的節(jié)點(diǎn)添加到DOM樹中。Document類的getDocumentElement()方法,返回代表文檔根節(jié)點(diǎn)的Element對象。在XML文檔中,根節(jié)點(diǎn)一定是唯一的。
TransformerFactory tFactory =TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new java.io.File("links.xml"));
transformer.transform(source, result);
然后就是用XSLT把DOM樹輸出了。這里的TransformerFactory也同樣應(yīng)用了工廠模式,使得具體的代碼同具體的變換器無關(guān)。實(shí)現(xiàn)的方法和DocumentBuilderFactory相同,這兒就不贅述了。Transformer類的transfrom方法接受兩個(gè)參數(shù)、一個(gè)數(shù)據(jù)源Source和一個(gè)輸出目標(biāo)Result。這里分別使用的是DOMSource和StreamResult,這樣就能夠把DOM的內(nèi)容輸出到一個(gè)輸出流中,當(dāng)這個(gè)輸出流是一個(gè)文件的時(shí)候,DOM的內(nèi)容就被寫入到文件中去了。
相關(guān)推薦:計(jì)算機(jī)等級考試二級Java經(jīng)典算法大全匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |