我在一个应用中,需要在页面上定时调用固定位置的data.xml数据(2k),然后在调用之前会调用服务器端的程序,让根据数据库中最新的数据更新data.xml、
现在使用jdom来操作,FileInputStream和FileOutputStream使用同一源地址(data.xml)。
先读取指定节点数据,然后更改节点数据,最后用XMLOutputter来存新数据。
使用过程中,发现,没调用一次它都是先把data.xml的内容清空(0k),然后再写入进去,这样页面上就只能获得空的节点数据了。有没有办法让他只更新部分数据,或者保证里面一直有数据供页面使用???

解决方案 »

  1.   

    jdom是先在内存中建立整个xml的树结构,然后在对树中的各个节点进行分析的
    给你一个例子吧
    <?xml version="1.0" encoding="GB2312"?> <?xml-stylesheet type="text/xsl" href="students.xsl"?><students>
        <student sn="01">
            <name>张三</name>
            <age>18</age>
        </student>
        
        <student sn="02">
            <name>李四</name>
            <age>20</age>
        </student>
    </students>jdom转换的代码
    import java.io.File;
    import java.io.IOException;import org.jdom.*;
    import org.jdom.input.SAXBuilder;
    import org.jdom.output.XMLOutputter;
    import org.jdom.output.Format;public class JDOMConvert
    {
        public static void main(String[] args)
        {
            SAXBuilder saxBuilder=new SAXBuilder();
            File file=new File("students.xml");
            try
            {
                Document doc=saxBuilder.build(file);
                //------------------添加节点------------------
                //创建表示一个学生信息的各元素节点
                Element eltStu=new Element("student");
                Element eltName=new Element("name");
                Element eltAge=new Element("age");
                
                //设置<name>和<age>元素的文本内容
                eltName.setText("王五");
                eltAge.setText("19");
                
                //将<name>和<age>元素添加为<student>元素的内容
                eltStu.addContent(eltName);
                eltStu.addContent(eltAge);
                
                //为<student>元素设置属性sn,值为03
                eltStu.setAttribute("sn","03");
                
                Element root=doc.getRootElement();
                root.addContent(eltStu);
                
                //------------------删除节点------------------
                root.removeChild("student");
                
                //------------------修改节点------------------
                root.getChild("student").getChild("age").setText("22");
                //Format fmt=Format.getRawFormat();
                XMLOutputter xmlOut=new XMLOutputter();
                Format fmt=Format.getPrettyFormat();
                fmt.setEncoding("GBK");
                fmt.setIndent("    ");
                xmlOut.setFormat(fmt);
                xmlOut.output(doc,System.out);
            }
            catch(IOException e){System.out.println(e.getMessage());}
            catch(JDOMException e){System.out.println(e.getMessage());}
        }    
    }
      

  2.   

    xmlOut.output(doc,System.out);
    我需要的又写回students.xml,不是打印在Console里面。至于写回我也
    XMLOutputter output = new XMLOutputter(format);
    fo = new FileOutputStream(url);
    output.output(doc,fo);
    写回去了。主要的现象是在中间操作的时候,会把整个students.xml的内容清除了,变成空。
    然后再一个一个的又重新写回去。我需要的时候 “怎么让他不清空原来的数据,只是把个别element的内容改一下”
      

  3.   

    现在读写存都没有问题我需要的是   “怎么让他不清空原来的数据,只是把个别element的内容改一下”
      

  4.   

    你的代码没有问题啊
    是不是修改后的输出也是正确的?
    你想让他不清空原来的数据,只是把个别element的内容改一下,这个只怕是不是太好实现,因为,jdom的语法规则就是一次读取完,输出的话一次输出完
    如果你想只修改个别节点,用dom4j会好一点
      

  5.   

    用Dom4j是要好些,不过又有问题出现了,就是总是解析的时候会多存字符进去,导致xml格式错误。
    比如<?xml version="1.0" encoding="utf-8"?>
    <dataList>
      <data><item>test</item></data>
    </dataList>
    总是出现<?xml version="1.0" encoding="utf-8"?>
    <dataList>
      <data><item>test</item></data>
    </dataList>>或者<?xml version="1.0" encoding="utf-8"?>
    <dataList>
      <data><item>test</item></data>
    </dataList>dataList>就是最后总会多出一些数据来。
      

  6.   

    可以看这个帖子:
    http://topic.csdn.net/u/20071210/11/ff8c8be6-c88c-4647-9525-11e5debd62f1.html