用java写xml文件,如何实现如下功能:
比如有一个完整的xml文件,现在要用程序修改里面的内容,但不能重新生成一遍文件,只是想修改改动过的地方,请问如何实现?就像在MyEclipse中用Struts时,struts的图形和相应的source是相对应的,改变了图形相应的代码也改变了。

解决方案 »

  1.   

    package 读取XML;public class JdbcInfo {

    private String driverClassName;

    private String url;

    private String userName;

    private String password; public String getDriverClassName() {
    return driverClassName;
    } public String getUrl() {
    return url;
    } public void setUrl(String url) {
    this.url = url;
    } public String getUserName() {
    return userName;
    } public void setUserName(String userName) {
    this.userName = userName;
    } public String getPassword() {
    return password;
    } public void setPassword(String password) {
    this.password = password;
    }
    public String toString(){
    return "driverClassName="+driverClassName+
    ",url="+url+
    ",userName="+userName+
    ",password="+password;
    } public void setDriverClassName(String text) {
    this.driverClassName = text;
    }

    }
    package 读取XML;import java.io.IOException;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;
    import org.jdom.xpath.XPath;import sun.text.CompactShortArray.Iterator;
    import 次方.Impl;public class GloabalConfigure {

    private static  GloabalConfigure instance = new GloabalConfigure();

    private static final String CONFIG_FILE_NAME = "MyXML.XML";

    private JdbcInfo jdbcInfo = new JdbcInfo();

    private Map beanMap = new HashMap();
    private Element rootElt;

    private GloabalConfigure(){
    SAXBuilder sb = new SAXBuilder();
    try {
    Document doc = sb.build(Thread.currentThread().getContextClassLoader().getResourceAsStream(CONFIG_FILE_NAME));
    this.rootElt = doc.getRootElement();
    initJdbcInfo();
    try {
    initBean();
    } catch (InstantiationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } catch (JDOMException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    }

    public static GloabalConfigure getInstance(){
    return instance;
    }
    private void initJdbcInfo(){
    try {
    Element driverClassNameElt = (Element)XPath.selectSingleNode(rootElt, "//sys-configure/jdbc-info/driver-class-name");
    //System.out.println(driverClassNameElt.getText());
    jdbcInfo.setDriverClassName(driverClassNameElt.getText());

    Element urlElt = (Element)XPath.selectSingleNode(rootElt, "//sys-configure/jdbc-info/url");
    jdbcInfo.setUrl(urlElt.getText());


    Element userElt = (Element)XPath.selectSingleNode(rootElt, "//sys-configure/jdbc-info/user-name");
    jdbcInfo.setUserName(userElt.getText());


    Element passwordElt = (Element)XPath.selectSingleNode(rootElt, "//sys-configure/jdbc-info/password");
    jdbcInfo.setPassword(passwordElt.getText());

    } catch (JDOMException e) {
    e.printStackTrace();
    }
    }

    private void initBean() throws InstantiationException, IllegalAccessException, ClassNotFoundException{
    try {
    List beanList = XPath.selectNodes(rootElt, "//sys-configure/beans/bean");
    for(java.util.Iterator iter=beanList.iterator(); iter.hasNext();){
    Element beanElt = (Element)iter.next();
    String id = beanElt.getAttributeValue("id");
    String className = beanElt.getAttributeValue("class");
    System.out.println("id"+id);
    System.out.println("name"+className);
    Object obj = Class.forName(className).newInstance();
    beanMap.put(id,obj );
    }
    } catch (JDOMException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

    public static void main(String args[]){
    System.out.println(GloabalConfigure.getInstance().getJdbcInfo());
    Impl i = (Impl)GloabalConfigure.getInstance().getBean(Impl.class);
    i.vv();
    } public JdbcInfo getJdbcInfo() {
    return jdbcInfo;
    }

    public Object getBean(Class c){
    return beanMap.get(c.getName());
    }
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <sys-configure>
    <jdbc-info>
    <driver-class-name>oracle.jdbc.driver.OracleDriver</driver-class-name>
    <url>jdbc:oracle:thin:@127.0.0.1:1521:sxt</url>
    <user-name>chen</user-name>
    <password>1111</password>
    </jdbc-info>
    <beans>
    <bean id="次方.CalcSum" class="次方.Impl"/>
    <bean id="次方.CalcSum" class="次方.Impl"/>
    </beans>

    </sys-configure>
      

  2.   

    用dom4j解析XML  在修改对应的节点即可   LZ可以看看这里Dom4j的使用
      

  3.   

    2楼说的很对,dom4j用起来确实很方便,建议去网上下一个。