隨筆-26  評(píng)論-13  文章-46  trackbacks-0
          JDom是不錯(cuò)的API,算得上簡(jiǎn)單高效,最重要是已經(jīng)成為jcp的一部分,這個(gè)咱得弄弄。不www.jdom.org上寫(xiě)文檔的人實(shí)在太懶,文檔出奇的少,流傳得最廣的恐怕是IBM上面的一篇《JDom讓java XML變得容易》,不過(guò)這篇文章只涉及基本的讀寫(xiě)操作,遠(yuǎn)不能勝任實(shí)際工作。花了兩天時(shí)間,把JDom的基本操作整理出來(lái)了,涵蓋了大部分的操作:元素、屬性、命名空間、PI、DTD、Schema,應(yīng)付一般的應(yīng)用沒(méi)什么問(wèn)題。反正我沒(méi)有在網(wǎng)上見(jiàn)到更加詳盡的版本,你見(jiàn)過(guò)的話(huà),請(qǐng)留下連接。暫時(shí)來(lái)不及編寫(xiě)詳細(xì)的說(shuō)明,先帖幾段程序,對(duì)有經(jīng)驗(yàn)的Java開(kāi)發(fā)者來(lái)說(shuō),已經(jīng)足夠了。程序都已經(jīng)經(jīng)過(guò)了實(shí)際的測(cè)試,我使用的JDom是0.9版。

           1、創(chuàng)建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("第二個(gè)元素");

              el1.addContent(text1);
                       el1.addContent(em);
                       
                       Element el2 
          = new Element("元素三").addContent("第三個(gè)元素");

                       root.addContent(el1);
                       root.addContent(el2);
                       
                       
          //縮進(jìn)四個(gè)空格,自動(dòng)換行,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驗(yàn)證的:
           

          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();
            }

            
           }


           需要說(shuō)明的是,這個(gè)程序沒(méi)有指明使用哪個(gè)DTD文件。DTD文件的位置是在XML中指定的,而且DTD不支持命名空間,一個(gè)XML只能引用一個(gè)DTD,所以程序直接讀取XML中指定的DTD,程序本身不用指定。不過(guò)這樣一來(lái),好象就只能使用外部式的DTD引用方式了?高人指點(diǎn)。

           3、XML Schema驗(yàn)證的:

           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);
              
          //導(dǎo)入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("驗(yàn)證失敗:"+e);
             }

             
            }

            
           }


           上面的程序就指出了要引入的XML Schema文件的位置。

           系統(tǒng)默認(rèn)輸出是UTF-8,這有可能導(dǎo)致出現(xiàn)亂碼。

           讀XML文檔的技巧在網(wǎng)上已經(jīng)泛濫,這里就沒(méi)有再列出來(lái)。

          posted on 2005-06-24 15:26 似水流年 閱讀(263) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): XML

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 洛隆县| 阳原县| 平陆县| 固安县| 高邑县| 保德县| 修水县| 永城市| 兰溪市| 台中市| 图们市| 锡林郭勒盟| 东台市| 孟州市| 扶沟县| 岳西县| 灵璧县| 高碑店市| 屏东县| 固始县| 麦盖提县| 贺兰县| 美姑县| 卢湾区| 延安市| 定陶县| 屏山县| 兴海县| 莒南县| 乌恰县| 灯塔市| 沈丘县| 错那县| 金川县| 醴陵市| 长白| 历史| 彰武县| 台中市| 平昌县| 灌阳县|