??xml version="1.0" encoding="utf-8" standalone="yes"?>黄色大片在线看,日本亚洲欧洲色α,亚洲一区二区三区免费在线观看http://www.aygfsteel.com/lcs/category/26137.html黑暗的SHQ灰暗的人生Q证明了我的心中q有一些光明! zh-cnThu, 14 Feb 2008 08:28:24 GMTThu, 14 Feb 2008 08:28:24 GMT60在Java中写文g的中文问题[转]http://www.aygfsteel.com/lcs/archive/2008/02/14/179922.htmllklkThu, 14 Feb 2008 06:20:00 GMThttp://www.aygfsteel.com/lcs/archive/2008/02/14/179922.htmlhttp://www.aygfsteel.com/lcs/comments/179922.htmlhttp://www.aygfsteel.com/lcs/archive/2008/02/14/179922.html#Feedback0http://www.aygfsteel.com/lcs/comments/commentRss/179922.htmlhttp://www.aygfsteel.com/lcs/services/trackbacks/179922.html写出来的文g用浏览器打开后都是ؕ码。已l在XML的最前面加上?br /> <?xml version="1.0" encoding="UTF-8"?>
而且览器的~码也是UTF-8的,q就排除了浏览器的问题?br /> 再用VIM打开Q发现用GB2312看是没问题的Q换?set encoding=UTF-8以后开始ؕ?br /> q时我尝试将字符串{码后写入文gQ但在UTF-8QGBK和ISO8859_1中间怎么转也没有用?br /> 忽然惌v前几天yiyayoyo同学和我提过Java写文仉认编码的问题Q于是开始googleQ发现我用的写文件的方式无法指定~码Q于是换用另一U写文g的方式指定UTF-8Q遂搞定。代码如下:

老代码:
PrintWriter pw = new PrintWriter(new FileWriter(path));
pw.print(content);
pw.close();

C码:
FileOutputStream fos = new FileOutputStream(path);
Writer out = new OutputStreamWriter(fos, "UTF-8");
out.write(content);
out.close();
fos.close();

Z抱怨一句,Java中写文g的方式还真是多阿?#8230;…我等一两年l验的小E序员看了都眼晕

   库卡 _
  M码也有编码的问题Q如果要dUTF-8的文Ӟ应采用如下方式覆盖默认编码:
  FileInputStream fis = new FileInputStream(s);
  StringBuffer content = new StringBuffer();
  DataInputStream in = new DataInputStream(fis);
  BufferedReader d = new BufferedReader(new InputStreamReader(in, "UTF-8"));
  String line = null;
   while ((line = d.readLine()) != null)
                      content.append(line + "\n");
  d.close();
  in.close();
  fis.close();



lk 2008-02-14 14:20 发表评论
]]>
利用XMLBean轻轻松松dXML http://www.aygfsteel.com/lcs/archive/2007/11/22/162316.htmllklkThu, 22 Nov 2007 03:08:00 GMThttp://www.aygfsteel.com/lcs/archive/2007/11/22/162316.htmlhttp://www.aygfsteel.com/lcs/comments/162316.htmlhttp://www.aygfsteel.com/lcs/archive/2007/11/22/162316.html#Feedback1http://www.aygfsteel.com/lcs/comments/commentRss/162316.htmlhttp://www.aygfsteel.com/lcs/services/trackbacks/162316.html 

利用XMLBean轻轻松松dXML

作者:叶枫




版权声明Q本文可以自p{载,转蝲时请务必以超链接形式标明文章原始出处和作者信息及本声?/span>
作?叶枫(http://blog.matrix.org.cn/page/叶枫)
原文:[http://www.matrix.org.cn/resource/article/44/44027_XMLBean.html]http://www.matrix.org.cn/resource/article/44/44027_XMLBean.html[/url]
关键?XML XMLBean Parser

一、关于XML解析

  XML在Java应用E序里变得越来越重要, q泛应用于数据存储和
交换. 比如我们常见的配|文?都是以XML方式存储? XMLq应?br /> 于Java Message Service和Web Services{技术作为数据交?
因此,正确dXML文档是XML应用的基.
  Java提供了SAX和DOM两种方式用于解析XML,但即便如?要读写一?br /> E微复杂的XML,也不是一件容易的?

二、XMLBean?/span>

    Hibernate已经成ؓ目前行的面向Java环境的对?关系数据库映工?
在Hibernate{对?关系数据库映工具出C?Ҏ据库的操作是
通过JDBC来实现的,Ҏ据库的Q何操?开发h员都要自己写SQL语句
来实? 对象/关系数据库映工具出现后,Ҏ据库的操作{成对
JavaBean的操?极大方便了数据库开? 所以如果有一个类似的工具能够
实现对XML的读写{成对JavaBean的操?会化XML的读?即对XML
不熟悉的开发h员也能方便地dXML. q个工具是XMLBean.

三、准备XMLBean和XML文档

   XMLBean是Apache的一个开源项?可以从http://www.apache.org下蝲,
最新的版本?.0. 解压后目录如?
xmlbean2.0.0
     +---bin
     +---docs
     +---lib
     +---samples
     +---schemas


另外q要准备一个XML文档(customers.xml),
在本文的例子?我们对q个文档q行d操作. 文档源码如下:

<?xml version="1.0" encoding="UTF-8"?>
<Customers>
    <customer>
            <id>1</id>
            <gender>female</gender>
            <firstname>Jessica</firstname>
            <lastname>Lim</lastname>
            <phoneNumber>1234567</phoneNumber>
            <address>
                <primaryAddress>
                        <postalCode>350106</postalCode>
                        <addressLine1>#25-1</addressLine1>
                        <addressLine2>SHINSAYAMA 2-CHOME</addressLine2>
                </primaryAddress>
                <billingAddress>
                        <receiver>Ms Danielle</receiver>
                        <postalCode>350107</postalCode>
                        <addressLine1>#167</addressLine1>
                        <addressLine2>NORTH TOWER HARBOUR CITY</addressLine2>
                </billingAddress>
            </address>
    </customer>
    <customer>
            <id>2</id>
            <gender>male</gender>
            <firstname>David</firstname>
            <lastname>Bill</lastname>
            <phoneNumber>808182</phoneNumber>
            <address>
                <primaryAddress>
                        <postalCode>319087</postalCode>
                        <addressLine1>1033 WS St.</addressLine1>
                        <addressLine2>Tima Road</addressLine2>
                </primaryAddress>
                <billingAddress>
                        <receiver>Mr William</receiver>
                        <postalCode>672993</postalCode>
                        <addressLine1>1033 WS St.</addressLine1>
                        <addressLine2>Tima Road</addressLine2>
                </billingAddress>
            </address>
    </customer>
</Customers>


q是一个客L数据模型,每个客户都有客户~号(ID),姓名,性别(gender),
电话L(phoneNumber)和地址,其中地址有两? 首要地址(PrimaryAddress)
和帐单地址(BillingAddress),每个地址有邮~?地址1,和地址2l成.
其中帐单地址q有收g?receiver).

    此外,q要准备一个配|文?文g名customer.xsdconfig),q个文g?br /> 作用我后面会?它的内容如下:

<xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config">

  <xb:namespace>
    <xb:package>sample.xmlbean</xb:package>
  </xb:namespace>

</xb:config>


四、XMLBean使用步骤

    和其他面向Java环境的对?关系数据库映工L使用步骤一?
在正式用XMLBean?我们要作两个准备.

    1. 生成XML Schema文g

       什么是XML Schema文g? 正常情况?每个XML文g都有一个Schema文g,
       XML Schema文g是一个XML的约束文?它定义了XML文g的结构和元素.
       以及对元素和l构的约? 通俗地讲,如果说XML文g是数据库里的记录,
       那么Schema是表结构定?

       Z么需要这个文? XMLBean需要通过q个文g知道一个XML文g?br />        l构以及U束,比如数据cd{? 利用q个Schema文g,XMLBean会产生
       一pd相关的Java Classes来实现对XML的操? 而作为开发h?则是
       利用XMLBean产生的Java Classes来完成对XML的操作而不需要SAX或DOM.

       怎样产生q个Schema文g? 如果对于熟悉XML的开发h?可以自己?br />        写这个Schema文g,对于不熟悉XML的开发h?可以通过一些工h完成.
       比较有名的如XMLSPY和Stylus Studio都可以通过XML文g来生成Schema
       文g. 加入我们已经生成q个Schema文g(customer.xsd):
      

       <?xml version="1.0" encoding="UTF-8"?>
       <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                  elementFormDefault="qualified">
         <xs:element name="Customers">
           <xs:complexType>
             <xs:sequence>
               <xs:element maxOccurs="unbounded" name="customer"
                           type="customerType"/>
             </xs:sequence>
           </xs:complexType>
         </xs:element>
       <xs:complexType name="customerType">
             <xs:sequence>
               <xs:element name="id" type="xs:int"/>
               <xs:element name="gender" type="xs:string"/>
               <xs:element name="firstname" type="xs:string"/>
               <xs:element name="lastname" type="xs:string"/>
               <xs:element name="phoneNumber" type="xs:string"/>
               <xs:element name="address" type="addressType"/>
             </xs:sequence>
       </xs:complexType>
         <xs:complexType name="addressType">
             <xs:sequence>
               <xs:element name="primaryAddress" type="primaryAddressType"/>
               <xs:element name="billingAddress" type="billingAddressType"/>
             </xs:sequence>
         </xs:complexType>

         <xs:complexType name="primaryAddressType">
             <xs:sequence>
               <xs:element name="postalCode" type="xs:string"/>
               <xs:element name="addressLine1" type="xs:string"/>
               <xs:element name="addressLine2" type="xs:string"/>
             </xs:sequence>
         </xs:complexType>
         <xs:complexType name="billingAddressType">
             <xs:sequence>
                   <xs:element name="receiver" type="xs:string"/>
               <xs:element name="postalCode" type="xs:string"/>
               <xs:element name="addressLine1" type="xs:string"/>
               <xs:element name="addressLine2" type="xs:string"/>
             </xs:sequence>
         </xs:complexType>
       </xs:schema>
      


    2. 利用scomp来生成Java Classes

       scomp是XMLBean提供的一个编译工?它在bin的目录下. 通过q个工具,
       我们可以以上的Schema文g生成Java Classes.
       scomp的语法如?-

      

       scomp [options] [dirs]* [schemaFile.xsd]* [service.wsdl]* [config.xsdconfig]*
      


       主要参数说明:
       -src [dir]                  -- 生成的Java Classes存放目录
     -srconly                  -- 不编译Java Classes,不生Jar文g
     -out [jarFileName]  -- 生成的Jar文g,~省是xmltypes.jar
       -compiler                 -- Java~译器的路径,即Javac的位|?br />        schemaFile.xsd    -- XML Schema文g位置
       config.xsdconfig   -- xsdconfig文g的位|? q个文g主要用来制定生成的Java Class
                              的一些文件名规则和Package的名U?在本?package是sample.xmlbean

       在本?我是q样q行?
      

       scomp -src build\src  -out build\customerXmlBean.jar schema\customer.xsd
             -compiler C:\jdk142_04\bin\javac customer.xsdconfig
      


       q个命o行的意思是告诉scomp生成customerXmlBean.jar,攑֜build目录?同时
       生成源代码放在build\src? Schema文g是customer.xsd,xsdconfig文g是customer.xsdconfig.

       其实, 生成的Java源代码没有多大作?我们要的是jar文g.我们先看一下build\src\sample\xmlbean下生成的Classes.
      

          CustomersDocument.java    -- 整个XML文档的Java Class映射
       CustomerType.java              -- 节点sustomer的映?br />        AddressType.java                 -- 节点address的映?br />        BillingAddressType.java        -- 节点billingAddress的映?br />        PrimaryAddressType.java      -- 节点primaryAddress的映?br />     


       好了,到此我们所有的准备工作已经完成? 下面开始进入重点:利用刚才生成的jar文gdXML.

五、利用XMLBean读XML文g

    新徏一个Java Project,XMLBean2.0.0\lib\下的Jar文g和刚才我们生成的customerXmlBean.jar加入
    到Project的ClassPath.

    新徏一个Java Class: CustomerXMLBean.  源码如下:
    

    package com.sample.reader;

    import java.io.File;
    
    import sample.xmlbean.*;
    import org.apache.commons.beanutils.BeanUtils;
    import org.apache.xmlbeans.XmlOptions;
    public class CustomerXMLBean {
    private String filename = null;
    
    public CustomerXMLBean(String filename) {
            super();
            this.filename = filename;
    }

    public void customerReader() {
            try {
              File xmlFile = new File(filename);
              CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);
              CustomerType[] customers = doc.getCustomers().getCustomerArray();
          
              for (int i = 0; i < customers.length; i++) {
                CustomerType customer = customers[i];
                println("Customer#" + i);
                println("Customer ID:" + customer.getId());
                println("First name:" + customer.getFirstname());
                println("Last name:" + customer.getLastname());
                println("Gender:" + customer.getGender());
                println("PhoneNumber:" + customer.getPhoneNumber());
                // Primary address
                PrimaryAddressType primaryAddress = customer.getAddress().getPrimaryAddress();
                println("PrimaryAddress:");
                println("PostalCode:" + primaryAddress.getPostalCode());
                println("AddressLine1:" + primaryAddress.getAddressLine1());
                println("AddressLine2:" + primaryAddress.getAddressLine2());
                // Billing address
                BillingAddressType billingAddress = customer.getAddress().getBillingAddress();
                println("BillingAddress:");
                println("Receiver:" + billingAddress.getReceiver());
                println("PostalCode:" + billingAddress.getPostalCode());
                println("AddressLine1:" + billingAddress.getAddressLine1());
                println("AddressLine2:" + billingAddress.getAddressLine2());
            
              }
            } catch (Exception ex) {
                    ex.printStackTrace();
            }
    }
    private void println(String str) {
          System.out.println(str);
    }
   public static void main(String[] args) {
      String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers.xml";
                  
     CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
                   customerXMLBean.customerReader();
    }

    }
    


    q行?参看输出l果:
    

       Customer#0
       Customer ID:1
       First name:Jessica
       Last name:Lim
       Gender:female
       PhoneNumber:1234567
       PrimaryAddress:
       PostalCode:350106
       AddressLine1:#25-1
       AddressLine2:SHINSAYAMA 2-CHOME
       BillingAddress:
       Receiver:Ms Danielle
       PostalCode:350107
       AddressLine1:#167
       AddressLine2:NORTH TOWER HARBOUR CITY

       Customer#1
       Customer ID:2
       First name:David
       Last name:Bill
       Gender:male
       PhoneNumber:808182
       PrimaryAddress:
       PostalCode:319087
       AddressLine1:1033 WS St.
       AddressLine2:Tima Road
       BillingAddress:
       Receiver:Mr William
       PostalCode:672993
       AddressLine1:1033 WS St.
       AddressLine2:Tima Road
    

    怎么?是不是很L? XMLBean的威?

六、利用XMLBean写XML文g

    利用XMLBean创徏一个XML文档也是一件轻而易丄?我们再增加一个Method,
    L一下的Java Class:
    

    public void createCustomer() {
    try {
        // Create Document
        CustomersDocument doc = CustomersDocument.Factory.newInstance();
        // Add new customer
        CustomerType customer = doc.addNewCustomers().addNewCustomer();
        // set customer info
        customer.setId(3);
        customer.setFirstname("Jessica");
        customer.setLastname("Lim");
        customer.setGender("female");
        customer.setPhoneNumber("1234567");
        // Add new address
        AddressType address = customer.addNewAddress();
        // Add new PrimaryAddress
        PrimaryAddressType primaryAddress = address.addNewPrimaryAddress();
        primaryAddress.setPostalCode("350106");
        primaryAddress.setAddressLine1("#25-1");
        primaryAddress.setAddressLine2("SHINSAYAMA 2-CHOME");

        // Add new BillingAddress
        BillingAddressType billingAddress = address.addNewBillingAddress();
        billingAddress.setReceiver("Ms Danielle");
        billingAddress.setPostalCode("350107");
        billingAddress.setAddressLine1("#167");
        billingAddress.setAddressLine2("NORTH TOWER HARBOUR CITY");

        File xmlFile = new File(filename);
        doc.save(xmlFile);
        } catch (Exception ex) {
                ex.printStackTrace();
        }

  }
    

    修改main method.
    

    public static void main(String[] args) {
    String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";
        CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
        customerXMLBean.createCustomer();
    }
    

    q行,打开customers_new.xml:
    

    <?xml version="1.0" encoding="UTF-8"?>
    <Customers>
    <customer>
            <id>3</id>
            <gender>female</gender>
            <firstname>Jessica</firstname>
            <lastname>Lim</lastname>
            <phoneNumber>1234567</phoneNumber>
            <address>
                    <primaryAddress>
                         <postalCode>350106</postalCode>
                         <addressLine1>#25-1</addressLine1>
                                       <addressLine2>SHINSAYAMA 2-CHOME</addressLine2>
                    </primaryAddress>
                    <billingAddress>
                        <receiver>Ms Danielle</receiver>
                        <postalCode>350107</postalCode>
                       <addressLine1>#167</addressLine1>
                       <addressLine2>NORTH TOWER HARBOUR CITY</addressLine2>
                    </billingAddress>
                    </address>
            </customer>
    </Customers>
    



七、利用XMLBean修改XML文g

    我们再增加一个Method:
    

      public void updateCustomer(int id,String lastname) {
         try {
        File xmlFile = new File(filename);
        CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);
        CustomerType[] customers = doc.getCustomers().getCustomerArray();
      
        for (int i = 0; i < customers.length; i++) {
           CustomerType customer = customers[i];
          if(customer.getId()==id){
                customer.setLastname(lastname);
                break;
            }
        }
        doc.save(xmlFile);
         } catch (Exception ex) {
          ex.printStackTrace();
         }
           }
    

    main method:
    

    public static void main(String[] args) {
     String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";
                    
    CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
                    
    customerXMLBean.updateCustomer(3,"last");
    }
    

    q行之后,我们会看到客户~号?的客Llastname已经改ؓlast.

八、利用XMLBean删除一个customer

    再增加一个Method:
    

    public void deleteCustomer(int id) {
     try {
      File xmlFile = new File(filename);
     CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);
    CustomerType[] customers = doc.getCustomers().getCustomerArray();

   for (int i = 0; i < customers.length; i++) {
        CustomerType customer = customers[i];
        if(customer.getId()==id){
                        customer.setNil() ;
                        break;
               }
   }
   doc.save(xmlFile);
   } catch (Exception ex) {
        ex.printStackTrace();
        }
   }


         main method:
    

    public static void main(String[] args) {
    String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";
                    
    CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);
                    
    customerXMLBean.deleteCustomer(3);
    }

        
q行,我们会看到客户~号?的客L资料已经被删?

九、查询XML

    除了本文在以上讲q的,利用XMLBean能轻L村֮成XML的读写操作外,l合XPath和XQuery,
   XMLBeanq能完成象SQL查询数据库一h便地查询XML数据. 关于XML查询以及如何创徏XML数据? 我将在另一文章里讨论.



十、结束语
    XMLBean能帮助我们轻易读写XML,q将有助于我们降低XML的学习和使用,有了q个基础,
    开发h员将为学习更多地XML相关技术和Web Services,JMS{其他J2EE技术打下良好地基础.


关于作者:
叶枫Q热爱Java和Oracle. 在Y件开发有q?0q? 目前在国外一家美国大公司担QSA, 负责技术研I。作者BlogQ?a target="_new">http://blog.matrix.org.cn/page/叶枫


lk 2007-11-22 11:08 发表评论
]]>
java sax 解析 xmlhttp://www.aygfsteel.com/lcs/archive/2007/11/22/162304.htmllklkThu, 22 Nov 2007 02:44:00 GMThttp://www.aygfsteel.com/lcs/archive/2007/11/22/162304.htmlhttp://www.aygfsteel.com/lcs/comments/162304.htmlhttp://www.aygfsteel.com/lcs/archive/2007/11/22/162304.html#Feedback0http://www.aygfsteel.com/lcs/comments/commentRss/162304.htmlhttp://www.aygfsteel.com/lcs/services/trackbacks/162304.html
代码Q?br />
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.Locator;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;
import java.io.IOException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;


class TestSAX extends DefaultHandler{
    
    
private StringBuffer buf;
    
private String str;
    
public TestSAX(){
        
super(); 
    }

    
//    public void setDocumentLocator(Locator locator){}
    
    
public void startDocument() throws SAXException{
        buf
=new StringBuffer();
        System.out.println(
"*******开始解析文?******");
    }

    
    
public void endDocument() throws SAXException{        
        System.out.println(
"*******文档解析l束*******");
    }

    
    
public void startPrefixMapping( String prefix, String uri ){
        System.out.println(
" 前缀映射: " + prefix +" 开?"+ " 它的URI?" + uri);
    }

    
    
public void endPrefixMapping( String prefix ){
        System.out.println(
" 前缀映射: "+prefix+" l束!");
    }

    
//    public void processingInstruction( String target, String instruction )throws SAXException{}
    
//    public void ignorableWhitespace( char[] chars, int start, int length ) throws SAXException {}
    
//    public void skippedEntity( String name ) throws SAXException {}
    
    
public void startElement(String namespaceURI,String localName,String qName,Attributes atts){
        System.out.println(
"*******开始解析元?******");    
        System.out.println(
"元素?/span>"+qName);        
        
for(int i=0;i<atts.getLength();i++){
            System.out.println(
"元素?/span>"+atts.getLocalName(i)+"属性?/span>"+atts.getValue(i));
        }

    }

    
    
public void endElement(String namespaceURI,String localName,String fullName )throws SAXException{
//        buf.trimToSize();
        str = buf.toString(); 
        System.out.println(
"buf = "+buf+" || length = "+buf.length());
        System.out.println(
"str = "+str.trim()+" || length = "+str.trim().length());
        buf.delete(
0,buf.length());
        System.out.println(
"******"+namespaceURI+"元素解析l束"+localName+"********"+fullName);
    }

    
    
public void characters( char[] chars, int start, int length )throws SAXException{
        
//元素内容篏加到StringBuffer?nbsp;
        buf.append(chars,start,length);
    }

    
    
public static void main(String args[]){
        
try{
            SAXParserFactory sf 
= SAXParserFactory.newInstance();
            SAXParser sp 
= sf.newSAXParser();
            TestSAX testsax
=new TestSAX();
            sp.parse(
new InputSource("test1.xml"),testsax);
        }
catch(IOException e){
            e.printStackTrace(); 
        }
catch(SAXException e){
            e.printStackTrace(); 
        }
catch(Exception e){
            e.printStackTrace(); 
        }

    }

}

xml文gQ我ȝ时候有错误Q用了自qQ希望其他h比我q运Q?br /> 代码Q?br />
<?xml version="1.0" encoding="GB2312"?>
<row>
<person>
<name>王小?/span></name>
<college>信息学院</college> 
<telephone>6258113</telephone>
<notes>?1955q生,博士Q?5q调入v南大?/span></notes>
</person>
</row> 


lk 2007-11-22 10:44 发表评论
]]>
java 读xml文g例子http://www.aygfsteel.com/lcs/archive/2007/11/21/162088.htmllklkWed, 21 Nov 2007 06:47:00 GMThttp://www.aygfsteel.com/lcs/archive/2007/11/21/162088.htmlhttp://www.aygfsteel.com/lcs/comments/162088.htmlhttp://www.aygfsteel.com/lcs/archive/2007/11/21/162088.html#Feedback0http://www.aygfsteel.com/lcs/comments/commentRss/162088.htmlhttp://www.aygfsteel.com/lcs/services/trackbacks/162088.html
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<books>
    
<book email="zhoujunhui">
        
<name>rjzjh</name>
        
<price>jjjjjj</price>
    
</book>
</books>

代码Q?br />
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
//下面主要是org.xml.sax包的c?/span>
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DomParse {

    
public DomParse(){
        
//Q?Q得到DOM解析器的工厂实例
        DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
        
//得到javax.xml.parsers.DocumentBuilderFactory;cȝ实例是我们要的解析器工?/span>
        try {
            
//Q?Q从DOM工厂获得DOM解析?/span>
            DocumentBuilder dombuilder=domfac.newDocumentBuilder();
            
//通过javax.xml.parsers.DocumentBuilderFactory实例的静态方法newDocumentBuilder()得到DOM解析?br />             //Q?Q把要解析的XML文档转化入流Q以便DOM解析器解析它
            InputStream is=new FileInputStream("test1.xml");            
            
//Q?Q解析XML文档的输入流Q得C个Document
            Document doc=dombuilder.parse(is);
            
//由XML文档的输入流得到一个org.w3c.dom.Document对象Q以后的处理都是对Document对象q行?br />             //Q?Q得到XML文档的根节点
            Element root=doc.getDocumentElement();
            
//在DOM中只有根节点是一个org.w3c.dom.Element对象?br />             //Q?Q得到节点的子节?/span>
            NodeList books=root.getChildNodes();
            
            
if(books!=null){
                
for(int i=0;i<books.getLength();i++){
                    Node book
=books.item(i);
                    
if(book.getNodeType()==Node.ELEMENT_NODE){
                        
//Q?Q取得节点的属性?/span>
                        String email=book.getAttributes().getNamedItem("email").getNodeValue();
                        System.out.println(email);
                        
//注意Q节点的属性也是它的子节点。它的节点类型也是Node.ELEMENT_NODE
                        
//Q?Q轮循子节点
                        for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){
                            
if(node.getNodeType()==Node.ELEMENT_NODE){
                                
if(node.getNodeName().equals("name")){
                                    String name
=node.getNodeValue();
                                    String name1
=node.getFirstChild().getNodeValue();
                                    System.out.println(name);
                                    System.out.println(name1);
                                }

                                
if(node.getNodeName().equals("price")){
                                    String price
=node.getFirstChild().getNodeValue();
                                    System.out.println(price);
                                }

                            }

                        }

                    }

                }
//Q?Q这是用一个org.w3c.dom.NodeList接口来存攑֮所有子节点的,q有一U轮循子节点的方法,后面有介l?/span>
            }

        }
 catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
 catch (FileNotFoundException e) {
            e.printStackTrace();
        }
 catch (SAXException e) {
            e.printStackTrace();
        }
 catch (IOException e) {
            e.printStackTrace();
        }

    }


    
public static void main(String[] args) {
        
new DomParse();
    }

}


q段代码的打印输ZؓQ?/p>

  null

  alterrjzjh

  jjjjjj

  从上面可以看?/p>

  String name=node.getNodeValue();

  是一个空倹{?/p>

  String name1=node.getFirstChild().getNodeValue();

  才是真正的|q是因ؓDOM?lt;name>rjzjh</name>也当作是两层l构的节点,其父节点



lk 2007-11-21 14:47 发表评论
]]>
Java中四UXML解析技?/title><link>http://www.aygfsteel.com/lcs/archive/2007/11/21/162077.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Wed, 21 Nov 2007 06:04:00 GMT</pubDate><guid>http://www.aygfsteel.com/lcs/archive/2007/11/21/162077.html</guid><wfw:comment>http://www.aygfsteel.com/lcs/comments/162077.html</wfw:comment><comments>http://www.aygfsteel.com/lcs/archive/2007/11/21/162077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/lcs/comments/commentRss/162077.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/lcs/services/trackbacks/162077.html</trackback:ping><description><![CDATA[在^时工作中Q难免会遇到?XML 作ؓ数据存储格式。面对目前种cȝ多的解决ҎQ哪个最适合我们呢?在这文章中Q我对这四种LҎ做一个不完全评测Q仅仅针寚w?XML q块来测试,因ؓ遍历 XML 是工作中使用最多的Q至我认ؓQ?<br /> <br />   ??<br /> <br />   <strong>试环境Q?<br /> </strong><br />   AMD 毒龙1.4G OC 1.5G?56M DDR333、Windows2000 Server SP4、Sun JDK 1.4.1+Eclipse 2.1+Resin 2.1.8Q在 Debug 模式下测试?<br /> <br />   XML 文g格式如下Q?<br /> <br />   Q?xml version="1.0" encoding="GB2312"?Q?<br />   QRESULTQ?<br />   QVALUEQ?<br />   QNOQA1234Q?NOQ?<br />   QADDRQ四川省XX县XX镇XX路XDXXP/ADDRQ?<br />   Q?VALUEQ?<br />   QVALUEQ?<br />   QNOQB1234Q?NOQ?<br />   QADDRQ四川省XX市XX乡XX村XXl</ADDRQ?<br />   Q?VALUEQ?<br />   Q?RESULTQ?<br /> <br />   <strong>试ҎQ?<br /> </strong><br />   采用 JSP 端调用BeanQ至于ؓ什么采用JSP来调用,请参考:http://blog.csdn.net/rosen/archive/2004/10/15/138324.aspxQ,让每一U方案分别解?0K?00K?000K?0000K?XML 文gQ计其消耗时_单位:毫秒Q?<br /> <br />   JSP 文gQ?<br /> <br />   Q?@ page contentType="text/html; charset=gb2312" %Q?<br />   Q?@ page import="com.test.*"%Q?<br /> <br />   QhtmlQ?<br />   QbodyQ?<br />   Q? <br />   String args[]={""}; <br />   MyXMLReader.main(args); <br />   %Q?<br />   Q?bodyQ?<br />   Q?htmlQ?<br /> <br /> <strong>  ??/strong> <br /> <br />   首先出场的是 DOMQJAXP Crimson 解析器) <br /> <br />   DOM 是用与^台和语言无关的方式表C?XML 文档的官?W3C 标准。DOM 是以层次l构l织的节Ҏ信息片断的集合。这个层ơ结构允许开发h员在树中L特定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因?DOM 被认为是Z树或Z对象的。DOM 以及q义的基于树的处理具有几个优炏V首先,׃树在内存中是持久的,因此可以修改它以便应用程序能Ҏ据和l构作出更改。它q可以在M时候在树中上下DQ而不是像 SAX 那样是一ơ性的处理。DOM 使用h也要单得多?<br /> <br />   另一斚wQ对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这L数据会更好。这些基于事件的模型Q比?SAX?<br /> <br />   Bean文gQ?<br /> <br />   package com.test; <br /> <br />   import java.io.*; <br />   import java.util.*; <br />   import org.w3c.dom.*; <br />   import javax.xml.parsers.*; <br /> <br />   public class MyXMLReader{ <br /> <br />   public static void main(String arge[]){ <br />   long lasting =System.currentTimeMillis(); <br />   try{ <br />    File f=new File("data_10k.xml"); <br />    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); <br />    DocumentBuilder builder=factory.newDocumentBuilder(); <br />    Document doc = builder.parse(f); <br />    NodeList nl = doc.getElementsByTagName("VALUE"); <br />    for (int i=0;iQnl.getLength();i++){ <br />     System.out.print("车牌L:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue()); <br />     System.out.println(" 车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue()); <br />   } <br />   }catch(Exception e){ <br />    e.printStackTrace(); <br />   } <br />   System.out.println("q行旉Q?+(System.currentTimeMillis() - lasting)+" 毫秒"); <br />   } <br />   } <br /> <br /> <br />   10k消耗时_265 203 219 172 <br />   100k消耗时_9172 9016 8891 9000 <br />   1000k消耗时_691719 675407 708375 739656 <br />   10000k消耗时_OutOfMemoryError <br /> <br />   接着?SAX <br /> <br />   q种处理的优炚w常类g媒体的优点。分析能够立卛_始,而不是等待所有的数据被处理。而且Q由于应用程序只是在d数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优炏V事实上Q应用程序甚至不必解析整个文档;它可以在某个条g得到满时停止解析。一般来_SAX q比它的替代?DOM 快许多? <p>   选择 DOM q是选择 SAX Q?<br /> <br />   对于需要自q写代码来处理 XML 文档的开发h员来_选择 DOM q是 SAX 解析模型是一个非帔R要的设计决策?<br /> <br />   DOM 采用建立树Şl构的方式访?XML 文档Q?SAX 采用的事件模型?<br /> <br />   DOM 解析器把 XML 文档转化Z个包含其内容的树Qƈ可以Ҏq行遍历。用 DOM 解析模型的优Ҏ~程ҎQ开发h员只需要调用徏树的指oQ然后利用navigation APIs讉K所需的树节点来完成Q务。可以很Ҏ的添加和修改树中的元素。然而由于?DOM 解析器的时候需要处理整?XML 文档Q所以对性能和内存的要求比较高,其是遇到很大的 XML 文g的时候。由于它的遍历能力,DOM 解析器常用于 XML 文档需要频J的改变的服务中?<br /> <br />   SAX 解析器采用了Z事g的模型,它在解析 XML 文档的时候可以触发一pd的事Ӟ当发现给定的tag的时候,它可以激zM个回调方法,告诉该方法制定的标签已经扑ֈ。SAX 对内存的要求通常会比较低Q因为它让开发h员自己来军_所要处理的tag。特别是当开发h员只需要处理文档中所包含的部分数据时QSAX q种扩展能力得到了更好的体现。但?SAX 解析器的时候编码工作会比较困难Q而且很难同时讉K同一个文档中的多处不同数据?<br /> <br />   Bean文gQ?<br /> <br />   package com.test; <br />   import org.xml.sax.*; <br />   import org.xml.sax.helpers.*; <br />   import javax.xml.parsers.*; <br /> <br />   public class MyXMLReader extends DefaultHandler { <br /> <br />   java.util.Stack tags = new java.util.Stack(); <br /> <br />   public MyXMLReader() { <br />   super(); <br />   } <br /> <br />   public static void main(String args[]) { <br />   long lasting = System.currentTimeMillis(); <br />   try { <br />    SAXParserFactory sf = SAXParserFactory.newInstance(); <br />    SAXParser sp = sf.newSAXParser(); <br />    MyXMLReader reader = new MyXMLReader(); <br />    sp.parse(new InputSource("data_10k.xml"), reader); <br />   } catch (Exception e) { <br />    e.printStackTrace(); <br />   } <br />   System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + " 毫秒"); <br />   } <br /> <br />   public void characters(char ch[], int start, int length) throws SAXException { <br />   String tag = (String) tags.peek(); <br />   if (tag.equals("NO")) { <br />    System.out.print("车牌LQ? + new String(ch, start, length)); <br />   } <br />   if (tag.equals("ADDR")) { <br />   System.out.println(" 地址:" + new String(ch, start, length)); <br />   } <br />   } <br /> <br />   public void startElement( <br />   String uri, <br />   String localName, <br />   String qName, <br />   Attributes attrs) { <br />   tags.push(qName); <br />   } <br />   } <br /> <br />   10k消耗时_110 47 109 78 <br />   100k消耗时_344 406 375 422 <br />   1000k消耗时_3234 3281 3688 3312 <br />   10000k消耗时_32578 34313 31797 31890 30328 <br /> <br />   然后?JDOM http://www.jdom.org/ <br /> <br />   JDOM 的目的是成ؓ Java 特定文档模型Q它化与 XML 的交互ƈ且比使用 DOM 实现更快。由于是W一?Java 特定模型QJDOM 一直得到大力推q和促进。正在考虑通过“Java 规范h JSR-102”它最l用?#8220;Java 标准扩展”。从 2000 q初已l开始了 JDOM 开发?<br /> <br />   JDOM ?DOM 主要有两斚w不同。首先,JDOM 仅用具体类而不使用接口。这在某些方面简化了 APIQ但是也限制了灵zL。第二,API 大量使用?Collections c,化了那些已经熟悉q些cȝ Java 开发者的使用?<br /> <br />   JDOM 文档声明其目的是“使用 20%Q或更少Q的_֊解决 80%Q或更多QJava/XML 问题”Q根据学习曲U假定ؓ 20%Q。JDOM 对于大多?Java/XML 应用E序来说当然是有用的Qƈ且大多数开发者发?API ?DOM Ҏ理解得多。JDOM q包括对E序行ؓ的相当广泛检查以防止用户做Q何在 XML 中无意义的事。然而,它仍需要您充分理解 XML 以便做一些超出基本的工作Q或者甚至理解某些情况下的错误)。这也许是比学习 DOM ?JDOM 接口都更有意义的工作?<br /> <br />   JDOM 自n不包含解析器。它通常使用 SAX2 解析器来解析和验证输?XML 文档Q尽它q可以将以前构造的 DOM 表示作ؓ输入Q。它包含一些{换器以将 JDOM 表示输出?SAX2 事g、DOM 模型?XML 文本文档。JDOM 是在 Apache 许可证变体下发布的开放源码?<br /> <br />   Bean文gQ?<br /> <br />   package com.test; <br /> <br />   import java.io.*; <br />   import java.util.*; <br />   import org.jdom.*; <br />   import org.jdom.input.*; <br /> <br />   public class MyXMLReader { <br /> <br />   public static void main(String arge[]) { <br />   long lasting = System.currentTimeMillis(); <br />   try { <br />    SAXBuilder builder = new SAXBuilder(); <br />    Document doc = builder.build(new File("data_10k.xml")); <br />    Element foo = doc.getRootElement(); <br />    List allChildren = foo.getChildren(); <br />    for(int i=0;iQallChildren.size();i++) { <br />     System.out.print("车牌L:" + ((Element)allChildren.get(i)).getChild("NO").getText()); <br />     System.out.println(" 车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText()); <br />    } <br />   } catch (Exception e) { <br />    e.printStackTrace(); <br />   } <br />   System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + " 毫秒"); <br />   } <br />   } <br /> <br />   10k消耗时_125 62 187 94 <br />   100k消耗时_704 625 640 766 <br />   1000k消耗时_27984 30750 27859 30656 <br />   10000k消耗时_OutOfMemoryError <br /> <br />   最后是 DOM4J http://dom4j.sourceforge.net/ <br /> <br />   虽然 DOM4J 代表了完全独立的开发结果,但最初,它是 JDOM 的一U智能分支。它合ƈ了许多超出基?XML 文档表示的功能,包括集成?XPath 支持、XML Schema 支持以及用于大文档或化文档的基于事件的处理。它q提供了构徏文档表示的选项Q它通过 DOM4J API 和标?DOM 接口hq行讉K功能。从 2000 下半q开始,它就一直处于开发之中?<br /> <br />   为支持所有这些功能,DOM4J 使用接口和抽象基本类Ҏ。DOM4J 大量使用?API 中的 Collections c,但是在许多情况下Q它q提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是Q虽?DOM4J 付出了更复杂?API 的代P但是它提供了?JDOM 大得多的灉|性?<br /> <br />   在添加灵zL、XPath 集成和对大文档处理的目标ӞDOM4J 的目标与 JDOM 是一LQ针?Java 开发者的易用性和直观操作。它q致力于成ؓ?JDOM 更完整的解决ҎQ实现在本质上处理所?Java/XML 问题的目标。在完成该目标时Q它?JDOM 更少防止不正的应用E序行ؓ?<br /> <br />   DOM4J 是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的Y件。如今你可以看到来多?Java 软g都在使用 DOM4J 来读?XMLQ特别值得一提的是连 Sun ?JAXM 也在?DOM4J?<br /> <br />   Bean文gQ?<br /> <br />   package com.test; <br /> <br />   import java.io.*; <br />   import java.util.*; <br />   import org.dom4j.*; <br />   import org.dom4j.io.*; <br /> <br />   public class MyXMLReader { <br /> <br />   public static void main(String arge[]) { <br />   long lasting = System.currentTimeMillis(); <br />   try { <br />    File f = new File("data_10k.xml"); <br />    SAXReader reader = new SAXReader(); <br />    Document doc = reader.read(f); <br />    Element root = doc.getRootElement(); <br />    Element foo; <br />    for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) { <br />     foo = (Element) i.next(); <br />     System.out.print("车牌L:" + foo.elementText("NO")); <br />     System.out.println(" 车主地址:" + foo.elementText("ADDR")); <br />    } <br />   } catch (Exception e) { <br />    e.printStackTrace(); <br />   } <br />   System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + " 毫秒"); <br />   } <br />   } <br /> <br />   10k消耗时_109 78 109 31 <br />   100k消耗时_297 359 172 312 <br />   1000k消耗时_2281 2359 2344 2469 <br />   10000k消耗时_20938 19922 20031 21078 <br /> <br />   JDOM ?DOM 在性能试时表C佻I在测?10M 文档时内存溢出。在文档情况下q值得考虑使用 DOM ?JDOM。虽?JDOM 的开发者已l说明他们期望在正式发行版前专注性能问题Q但是从性能观点来看Q它实没有值得推荐之处。另外,DOM 仍是一个非常好的选择。DOM 实现q泛应用于多U编E语a。它q是许多其它?XML 相关的标准的基础Q因为它正式获得 W3C 推荐Q与Z非标准的 Java 模型相对Q,所以在某些cd的项目中可能也需要它Q如?JavaScript 中?DOMQ?<br /> <br />   SAX表现较好Q这要依赖于它特定的解析方式。一?SAX 即到来的XML,但ƈ没有载入到内存(当然当XML被dӞ会有部分文档暂时隐藏在内存中Q?<br /> <br />   无疑QDOM4J是这场测试的莯者,目前许多开源项目中大量采用 DOM4JQ例如大名鼎鼎的 Hibernate 也用 DOM4J 来读?XML 配置文g。如果不考虑可移植性,那就采用DOM4J吧!</p> <img src ="http://www.aygfsteel.com/lcs/aggbug/162077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lcs/" target="_blank">lk</a> 2007-11-21 14:04 <a href="http://www.aygfsteel.com/lcs/archive/2007/11/21/162077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java解析XMLhttp://www.aygfsteel.com/lcs/archive/2007/11/21/162076.htmllklkWed, 21 Nov 2007 06:02:00 GMThttp://www.aygfsteel.com/lcs/archive/2007/11/21/162076.htmlhttp://www.aygfsteel.com/lcs/comments/162076.htmlhttp://www.aygfsteel.com/lcs/archive/2007/11/21/162076.html#Feedback0http://www.aygfsteel.com/lcs/comments/commentRss/162076.htmlhttp://www.aygfsteel.com/lcs/services/trackbacks/162076.html 用了一下org.w3c.dom解析Q不太方便,特别是进行修Ҏ?br /> 后来扑ֈ了dom4jq个工具包。方便多了。呵。。记录一下,以后用得着?br />

首先通过org.w3c.dom解析
InitFromXML.java

package system.init;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


/**
* @author yymoth
*
*/
public class InitFromXML {

    private HashMap prop = new HashMap(); //存储从文件中d的所有配|信?br />     private HashMap temp = new HashMap(); //传入的参敎ͼ用来生成新的XML配置文g
    private static String xmlFileName ="SystemInit.xml";
    private static String xmlFilePath = InitFromXML.class.getClassLoader().getResource(xmlFileName).getPath();
    
    private static InitFromXML instance = null;
    
    public static synchronized InitFromXML getInstance()
    {
        if(instance == null)
        {    instance = new InitFromXML();    }
        
        return instance;
    }
    
    /**
     *
     */
    public InitFromXML() {
        super();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new InitFromXML().getSystemProperty();
        
        HashMap temp = new HashMap();
        temp.put("outputImageDevice","outputImageDeviceVVVVV");
        temp.put("inputSceneFilePath","inputSceneFilePathVVVVV");
        temp.put("fetchIRADFactor",0.11);
        temp.put("fcpr_upLimit",111);
        
        new InitFromXML().updateSystemProperty(temp);
    
    }

    /**
     * 把xml文gd内容Q在内存中生dom? 修改它的内容不会影响文g;
     * @return
     */
    public HashMap getSystemProperty()
    {        
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db;
        try {
            db = dbf.newDocumentBuilder();
            System.out.println("开始读取配|文? " + xmlFilePath);
            Document d = db.parse(xmlFilePath);
            
            NodeList nl = d.getElementsByTagName("outputImageDevice");
            Node mynode = nl.item(0);
            String outputImageDevice = mynode.getFirstChild().getNodeValue();
            prop.put("outputImageDevice",outputImageDevice);
            
            System.out.println("输出路径= "+prop.get("outputImageDevice").toString());
            
            nl = d.getElementsByTagName("inputSceneFilePath");
            mynode = nl.item(0);
            String inputSceneFilePath = mynode.getFirstChild().getNodeValue();
            prop.put("inputSceneFilePath",inputSceneFilePath);
            
            System.out.println("输入场景路径= "+prop.get("inputSceneFilePath"));
            
            
            nl = d.getElementsByTagName("fetchIRADFactor");
            mynode = nl.item(0);
            String fetchIRADFactor= mynode.getFirstChild().getNodeValue();
            prop.put("fetchIRADFactor",fetchIRADFactor);
            
            System.out.println("I闲Render选择因子= "+prop.get("fetchIRADFactor"));
            
            
            nl = d.getElementsByTagName("fcpr_upLimit");
            mynode = nl.item(0);
            int fcpr_upLimit = Integer.parseInt(mynode.getFirstChild().getNodeValue().toString().trim());
            prop.put("fcpr_upLimit",fcpr_upLimit);
            
            System.out.println("单台Render最大渲染? "+prop.get("fcpr_upLimit"));
            
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return this.prop;
    }
    
    
    /**
     * 更新pȝ参数
     *
     */
    public void updateSystemProperty(HashMap temp)
    {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = null;
        
        try {
            db = dbf.newDocumentBuilder();
            Document doc = db.parse(xmlFilePath);
            
            
            NodeList nl = doc.getElementsByTagName("outputImageDevice");
            Node mynode = nl.item(0);
            mynode.setTextContent((String)temp.get("outputImageDevice"));
            //mynode.setNodeValue((String)temp.get("outputImageDevice"));
        
            
            nl = doc.getElementsByTagName("inputSceneFilePath");
            mynode = nl.item(0);
            mynode.setTextContent((String)temp.get("inputSceneFilePath"));
        
            nl = doc.getElementsByTagName("fetchIRADFactor");
            mynode = nl.item(0);
            mynode.setTextContent((String)temp.get("fetchIRADFactor"));
            
            nl = doc.getElementsByTagName("fcpr_upLimit");
            mynode = nl.item(0);
            mynode.setTextContent((String)temp.get("fcpr_upLimit"));
            
            
            writeToXML(doc);
            
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    
        
        
        
    }
    
    
    /**
     * 把Document对象生成文g;
     * @param doc
     */
    
    public void writeToXML(Document doc)
    {
        TransformerFactory tfactory = TransformerFactory.newInstance();
        try {
            Transformer tf = tfactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File(xmlFilePath));
            tf.transform(source,result);
        } catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
}




下面q个是通过DOM4JQ?使用之前要下载dom4j包。官方站点:www.dom4j.org

Dom4j.java


package wcrs_master.test;

/**
* @author yymoth
*
*/
import java.io.IOException;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.dom4j.io.SAXReader;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.Attribute;

import system.init.InitFromXML;

import java.io.FileWriter;

public class Dom4j {
    private static String xmlFileName ="SystemInit.xml";
    private static String xmlFilePath = Dom4j.class.getClassLoader().getResource(xmlFileName).getPath();
    private static Dom4j instance = null;
    public Dom4j() {
    }

    public static synchronized Dom4j getInstance()
    {
        if(instance == null)
        {    instance = new Dom4j();    }
        
        return instance;
    }
    
    
    
    public Document parse(String sfile) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File(sfile));
        return document;
    }

    public void update(HashMap temp) throws IOException {
        Document document = null;
            try {
                document = new Dom4j().parse(xmlFilePath);
                Element root = document.getRootElement(); //得到根节点目?br />                 Iterator iter = root.elementIterator();
                System.out.println("\r\n****** 获取的数据如?******");
                System.out.println(xmlFilePath);
                while (iter.hasNext()) {
                    Element titleElement = (Element) iter.next();
                    // 修改xml元素
                    System.out.print(titleElement.getName()+"  ==  ");
                    System.out.println(titleElement.getData().toString());
                    
                    if (titleElement.getName().equals("outputImageDevice")) {
                        titleElement.setText(temp.get("outputImageDevice").toString());
                    }
                    if (titleElement.getName().equals("fetchIRADFactor")) {
                        titleElement.setText(temp.get("fetchIRADFactor").toString());
                    }
                    if (titleElement.getName().equals("inputSceneFilePath")) {
                        titleElement.setText(temp.get("inputSceneFilePath").toString());
                    }
                    if (titleElement.getName().equals("fcpr_upLimit")) {
                        titleElement.setText(temp.get("fcpr_upLimit").toString());
                    }
                }

            
            } catch (DocumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            writeToXML(document);

    }

    /**
     * 把xml文gd内容Q在内存中生dom? 修改它的内容不会影响文g;
     * @return
     */
    public HashMap getSystemProperty()
    {
        HashMap temp = new HashMap();
        Document document ;
        try {
            document = new Dom4j().parse(xmlFilePath);
            Element root = document.getRootElement(); //得到根节点目?br />             Iterator iter = root.elementIterator();
            while(iter.hasNext())
            {
                Element titleElement = (Element) iter.next();
                temp.put(titleElement.getName(),titleElement.getData());
            }
            
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return temp;
    }
    
    
    /**
     * 写入文g
     * @param document
     */
    
    public void writeToXML(Document document)
    {
        // 输出全部原始数据Q在~译器中昄
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer;
        try {
            writer = new XMLWriter(System.out, format);
            //System.out.println("\r\n------------------Start------------------");
            writer.write(document);  
            //System.out.println("\r\n-------------------End-------------------");
            writer.close();
            // 输出全部原始数据Qƈ用它生成新的我们需要的XML文g
            XMLWriter writer2 = new XMLWriter(new FileWriter(new File(
                    xmlFilePath)), format);
            writer2.write(document); //输出到文?br />             writer2.close();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    }
    
    
    
    public static void main(String[] args) {
        
        HashMap temp = new HashMap();
        
        temp.put("outputImageDevice","outputImageDeviceVVVVV");
        temp.put("inputSceneFilePath","inputSceneFilePathVVVVV");
        temp.put("fetchIRADFactor",0.11);
        temp.put("fcpr_upLimit",11);
        
        Dom4j dom4j = new Dom4j();
        try {
            dom4j.update(temp);

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}



lk 2007-11-21 14:02 发表评论
]]>
Jdom使用指南http://www.aygfsteel.com/lcs/archive/2007/11/20/161897.htmllklkTue, 20 Nov 2007 09:04:00 GMThttp://www.aygfsteel.com/lcs/archive/2007/11/20/161897.htmlhttp://www.aygfsteel.com/lcs/comments/161897.htmlhttp://www.aygfsteel.com/lcs/archive/2007/11/20/161897.html#Feedback0http://www.aygfsteel.com/lcs/comments/commentRss/161897.htmlhttp://www.aygfsteel.com/lcs/services/trackbacks/161897.html?span xml:lang="EN-US">xml文档的解?span xml:lang="EN-US">java中有很多U方法,例如使用dom?span xml:lang="EN-US">sax?span xml:lang="EN-US">jdom{等Q相比之下,我觉得还?span xml:lang="EN-US">jdom比较方便。下面介l一?span xml:lang="EN-US">jdom的基本用方法,不对之处q请各位|友之交。谢谢!

最新的jdom可以C的网站:http://www.jdom.orgM载,现在的版本是1.0版,下蝲之后得?span xml:lang="EN-US">jdom-1.0.zip文gQ解压后q入build文g夹将看到一个名?span xml:lang="EN-US">jdom.jar的包Q这个就?span xml:lang="EN-US">jdom的类包了Q将它加C?span xml:lang="EN-US">classpath里就可以使用jdom提供的各U处?span xml:lang="EN-US">xml的类和他们的Ҏ了。应该注意的是在解压后的文g多wq有一?span xml:lang="EN-US">lib文g夹,里面保存的是使用jdom的环境包Q不q我在我?span xml:lang="EN-US">jdk1.4下用没引用q些包一样好用,不知道是jdk1.4中已l包含了q些东西q是原来我的eclipse已经引用了这些包Q呵c?/span>

好了Q书归正传,现在开始介l?span xml:lang="EN-US">jdom包的使用?br />


   jdom
包的l构包括Q?/span>

org.jdom                包含了所有的xml文档要素?span xml:lang="EN-US">javac?/span>

org.jdom.adapters         包含了与dom适配?span xml:lang="EN-US">javac?/span>

org.jdom.filter            包含?span xml:lang="EN-US">xml文档的过滤器c?/span>

org.jdom.input            包含了读?span xml:lang="EN-US">xml文档的类

org.jdom.output           包含了写?span xml:lang="EN-US">xml文档的雷

org.jdom.transform        包含了将jdom xml文档接口转换为其?span xml:lang="EN-US">xml文档接口

org.jdom.xpath            包含了对xml文档xpath操作的类

下面通过一个例子介l?span xml:lang="EN-US">jdom的常用操?/span>

生成xml文档Q?/span>

下面的类生成一?span xml:lang="EN-US">xml文档Q?/span>

/*

 * Created on 2004-10-9

 *

 * 写入xml文g的例?/span>

 */

/**

 * @author lnman

 *

 * To change the template for this generated type comment go to

 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments

 */

import java.io.*;

import org.jdom.*;

import org.jdom.output.*;

public class WriteXML

{

    public void BuildXML() throws Exception

    {

        Element root,student,number,name,age;

               

        root = new Element("student-info"); //生成根元素:student-info  

        student = new Element("student");      //生成元素Q?span xml:lang="EN-US">student,该元素中包含元?span xml:lang="EN-US">number,name,age

        number = new Element("number");

        name = new Element("name");

        age = new Element("age");

       

        Document doc = new Document(root);    //根元素植入文档doc?/span>

       

        number.setText("001");

        name.setText("lnman");

        age.setText("24");

        student.addContent(number);

        student.addContent(name);

        student.addContent(age);

        root.addContent(student);

       

        Format format = Format.getCompactFormat();

        format.setEncoding("gb2312");           //xml文g的字Wؓgb2312

        format.setIndent("    ");               //xml文g的羃qؓ4个空?/span>

       

        XMLOutputter XMLOut = new XMLOutputter(format);//在元素后换行Q每一层元素羃排四?/span>

        XMLOut.output(doc, new FileOutputStream("studentinfo.xml")); 

       

    }

   

    public static void main(String[] args) throws Exception

    {

        WriteXML w = new WriteXML();

        System.out.println("Now we build an XML document .....");

        w.BuildXML();

        System.out.println("finished!");

    }

}

生成?span xml:lang="EN-US">xml文档为:

<?xml version="1.0" encoding="gb2312"?>

<student-info>

    <student>

        <number>001</number>

        <name>lnman</name>

        <age>24</age>

    </student>

</student-info>

dxml文档的例子:

/*

 * Created on 2004-10-9

 *

 *?span xml:lang="EN-US">jdomdxml文档的例?/span>

 *

 */

/**

 * @author lnman

 *

 * To change the template for this generated type comment go to

 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments

 */

import org.jdom.output.*;

import org.jdom.input.*;

import org.jdom.*;

import java.io.*;

import java.util.*;

public class ReadXML

{

   

    public static void main(String[] args) throws Exception

    {

       

       

        SAXBuilder builder = new SAXBuilder();

        Document read_doc = builder.build("studentinfo.xml");

        Element stu = read_doc.getRootElement();

        List list = stu.getChildren("student");

        for(int i = 0;i < list.size();i++)

        {

            Element e = (Element)list.get(i);

            String str_number = e.getChildText("number");

            String str_name = e.getChildText("name");

            String str_age = e.getChildText("age");

            System.out.println("---------STUDENT--------------");

            System.out.println("NUMBER:" + str_number);

            System.out.println("NAME:" + str_name);

            System.out.println("AGE:" + str_age);

            System.out.println("------------------------------");

            System.out.println();

        }      

    }

}

Xpath例子Q?/span>

JDOM的关?span xml:lang="EN-US">XPATH?span xml:lang="EN-US">api?span xml:lang="EN-US">org.jdom.xpathq个包里。这个包下,有一个抽象类XPath.java和实现类JaxenXPath.javaQ?nbsp;使用时先?span xml:lang="EN-US">XPathcȝ静态方?span xml:lang="EN-US">newInstance(String xpath)得到XPath对象Q然后调用它?span xml:lang="EN-US">selectNodes(Object context)Ҏ?span xml:lang="EN-US">selectSingleNode(Object context)ҎQ前者根?span xml:lang="EN-US">xpath语句q回一l节?span xml:lang="EN-US">(List对象)Q后者根据一?span xml:lang="EN-US">xpath语句q回W合条g的第一个节?span xml:lang="EN-US">(Objectcd)。请?span xml:lang="EN-US">jdom-1.0自带的范例程序:
     
它分析在web.xml文g中的注册?span xml:lang="EN-US">servlet的个数及参数个数Qƈ输出角色名?
web.xml
文gQ?
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
    "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
-->

<web-app>
    <servlet>
        <servlet-name>snoop</servlet-name>
        <servlet-class>SnoopServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>file </servlet-name>
        <servlet-class>ViewFile</servlet-class>
        <init-param>
            <param-name>initial</param-name>
            <param-value>1000</param-value>
            <description>The initial value for the counter  <!-- optional --></description>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>mv</servlet-name>
        <url-pattern>*.wm</url-pattern>
    </servlet-mapping>
    <distributed/>

    <security-role>
      <role-name>manager</role-name>
      <role-name>director</role-name>
      <role-name>president</role-name>
    </security-role>
</web-app>

处理E序Q?
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
import org.jdom.xpath.*;

/**
 * <p><code>XPathReader</code> demonstrates how to
 *   read a Servlet 2.2 Web Archive file using XPath.
 * </p>
 * 
 * @author Jason Hunter
 * @version 1.0
 */
public class XPathReader {
    
    public static void main(String[] args) throws IOException, JDOMException {
        if (args.length != 1) {
            System.err.println("Usage: java XPathReader web.xml");
            return;
        }
        String filename = args[0];//
从命令行输入web.xml
        PrintStream out = System.out;

        SAXBuilder builder = new SAXBuilder();
        Document doc = builder.build(new File(filename));//
得到Document对象

        // Print servlet information
        XPath servletPath = XPath.newInstance("http://servlet");//,
选择L路径?span xml:lang="EN-US">servlet元素
        List servlets = servletPath.selectNodes(doc);//
q回所有的servlet元素?

        out.println("This WAR has "+ servlets.size() +" registered servlets:");
        Iterator i = servlets.iterator();
        while (i.hasNext()) {//
输出servlet信息
            Element servlet = (Element) i.next();
            out.print(""t" + servlet.getChild("servlet-name")
                                    .getTextTrim() +
                      " for " + servlet.getChild("servlet-class")
                                       .getTextTrim());
            List initParams = servlet.getChildren("init-param");
            out.println(" (it has " + initParams.size() + " init params)"); 
        }
            
        // Print security role information
        XPath rolePath = XPath.newInstance("http://security-role/role-name/text()");
        List roleNames = rolePath.selectNodes(doc);//
得到所有的角色?

        if (roleNames.size() == 0) {
            out.println("This WAR contains no roles");
        } else {
            out.println("This WAR contains " + roleNames.size() + " roles:");
            i = roleNames.iterator();
            while (i.hasNext()) {//
输出角色?
                out.println(""t" + ((Text)i.next()).getTextTrim());
            }
        }
    }    
}

输出l果:
C:"java>java   XPathReader web.xml
This WAR has 2 registered servlets:
        snoop for SnoopServlet (it has 0 init params)
        file for ViewFile (it has 1 init params)
This WAR contains 3 roles:
        manager
        director
        president



lk 2007-11-20 17:04 发表评论
]]>
վ֩ģ壺 | | Ͳ| | ̨ɽ| α| | ԭƽ| | ָɽ| | | | ͳ| | | | Т| | | | | | ۶| | ʯ¥| ɽ| ֦| | | | ˮ| ̫| ߱| ȷɽ| Ĵʡ| ޽| ֱ| | | ȫ|