JDom使用詳解(轉)
(bromon原創?版權所有?轉)?JDom是不錯的API,算得上簡單高效,最重要是已經成為jcp的一部分,這個咱得
弄弄。不www.jdom.org上寫文檔的人實在太懶,文檔出奇的少,流傳得最廣的恐怕是IBM上面的一篇《JDom讓java?XML變得容易》,不
過這篇文章只涉及基本的讀寫操作,遠不能勝任實際工作?;藘商鞎r間,把JDom的基本操作整理出來了,涵蓋了大部分的操作:元素、屬性、命名空間、
PI、DTD、Schema,應付一般的應用沒什么問題。反正我沒有在網上見到更加詳盡的版本,你見過的話,請留下連接。暫時來不及編寫詳細的說明,先帖
幾段程序,對有經驗的Java開發者來說,已經足夠了。程序都已經經過了實際的測試,我使用的JDom是0.9版。
?1、創建XML文檔:
?import?java.io.*;
?import?org.jdom.*;
?import?org.jdom.input.*;
?import?org.jdom.output.*;
?public?class?CreateXML
?{
??public?void?Create()
??{
???try
???{
????Document?doc?=?new?Document();???
????ProcessingInstruction?pi=new?ProcessingInstruction("xml-stylesheet","type="text/xsl"?href="test.xsl"");
????doc.addContent(pi);
????
????Namespace?ns?=?Namespace.getNamespace("http://www.bromon.org" );
????Namespace?ns2?=?Namespace.getNamespace("other",?"http://www.w3c.org" );
????Element?root?=?new?Element("根元素",?ns);
????root.addNamespaceDeclaration(ns2);
????doc.setRootElement(root);
????Element?el1?=?new?Element("元素一");
????el1.setAttribute("屬性",?"屬性一");
????
????Text?text1=new?Text("元素值");
?????????????Element?em?=?new?Element("元素二").addContent("第二個元素");
????el1.addContent(text1);
?????????????el1.addContent(em);
?????????????
?????????????Element?el2?=?new?Element("元素三").addContent("第三個元素");
?????????????root.addContent(el1);
?????????????root.addContent(el2);
?????????????
?????????????//縮進四個空格,自動換行,gb2312編碼
?????????????XMLOutputter?outputter?=?new?XMLOutputter("??",?true,"GB2312");
?????????????outputter.output(doc,?new?FileWriter("test.xml"));
?????????}catch(Exception?e)
?????????{
??????????System.out.println(e);
?????????}
?????}
?????
?????public?static?void?main(String?args[])
?????{
??????new?CreateXML().Create();
?????}
?????
?}
?2、DTD驗證的:
?import?java.io.*;
?import?org.jdom.*;
?import?org.jdom.input.*;
?import?org.jdom.output.*;
?public?class?XMLWithDTD
?{
??public?void?validate()
??{
???try
???{
????SAXBuilder?builder?=?new?SAXBuilder(true);
????builder.setFeature("http://xml.org/sax/features/validation";,true);
????Document?doc?=?builder.build(new?FileReader("author.xml"));
????
????System.out.println("搞掂");
????XMLOutputter?outputter?=?new?XMLOutputter();
????outputter.output(doc,?System.out);
???}catch(Exception?e)
???{
????System.out.println(e);
???}
???
??}
??public?static?void?main(String?args[])
??{
???new?XMLWithDTD().validate();
??}
??
?}
?
需要說明的是,這個程序沒有指明使用哪個DTD文件。DTD文件的位置是在XML中指定的,而且DTD不支持命名空間,一個XML只能引用一個DTD,所
以程序直接讀取XML中指定的DTD,程序本身不用指定。不過這樣一來,好象就只能使用外部式的DTD引用方式了?高人指點。
?3、XML?Schema驗證的:
?import?java.io.*;
?import?org.jdom.*;
?import?org.jdom.input.*;
?import?org.jdom.output.*;
?public?class?XMLWithSchema
?{
??String?xml="test.xml";
??String?schema="test-schema.xml";
??public?void?validate()
??{
???try
???{
????SAXBuilder?builder?=?new?SAXBuilder(true);
????//指定約束方式為XML?schema
????builder.setFeature("http://apache.org/xml/features/validation/schema";, ?true);
????//導入schema文件
????builder.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation";,schema);
????Document?doc?=?builder.build(new?FileReader(xml));
????
????System.out.println("搞掂");
????XMLOutputter?outputter?=?new?XMLOutputter();
????outputter.output(doc,?System.out);
???}catch(Exception?e)
???{
????System.out.println("驗證失敗:"+e);
???}
???
??}
??
?}
?上面的程序就指出了要引入的XML?Schema文件的位置。
?系統默認輸出是UTF-8,這有可能導致出現亂碼。
?讀XML文檔的技巧在網上已經泛濫,這里就沒有再列出來。