打印

[Java] 一个for循环判断的问题,请大家帮忙

一个for循环判断的问题,请大家帮忙

小弟最近写个程序,用XML做配置文件,有些参数要写到XML中去,但在条件判断时出现了问题,想请大家帮忙看看,谢谢,代码如下:
我想实现的功能是,根据WriteXML函数带入的SectionName(小结名),KeyName(键值名),KeyValue(键值)这三个函数,判断xml文件中是否存在相同的小结名或键值名,如果存在,则修改对应的键值,如果不存在,则创建新的小结。

其中a1.xml文件的格式如下:
复制内容到剪贴板
代码:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SERVER>
    <CRM>
        <IP>162.105.167.4</IP>
        <PORT>5000</PORT>
        <CHARSET>cp850</CHARSET>
        <DBNAME>BF_CRM</DBNAME>
        <DBTYPE>SYBASE</DBTYPE>
    </CRM>
    <TESTSERVER>
        <IP>162.105.167.2</IP>
        <PORT>6000</PORT>
        <CHARSET>cp850</CHARSET>
        <DBNAME>JYGS_DDS</DBNAME>
        <DBTYPE>SYBASE</DBTYPE>
    </TESTSERVER>
    <JRDBH>
        <IP>162.105.198.2</IP>
        <PORT>6000</PORT>
        <CHARSET>1234</CHARSET>
        <DBNAME>JRDBH_JXC</DBNAME>
        <DBTYPE>SYBASE</DBTYPE>
    </JRDBH>
</SERVER>
复制内容到剪贴板
代码:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
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;


public class ReadWriteXML {

    public ReadWriteXML(String FileName){
        this.FileName = FileName;
        try{
            bulider = factory.newDocumentBuilder();
            doc = bulider.parse(FileName);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

        /**
     *  
     * @param SectionName   小结名  
     * @param KeyName    键值名
     * @param KeyValue   键值
     */
    public void WriteXML(String SectionName,String KeyName,String KeyValue){
        doc.normalize();
        Element rootElement = doc.getDocumentElement();
        NodeList SectionNodeList = rootElement.getChildNodes();

        //遍历所有小结,判断是否有相同的小结名
         //[b]程序遍历的时候有问题,但不知道如何修改[/b]
        for(int i = 0;i < SectionNodeList.getLength();i++){
                        if(SectionNodeList.item(i).getNodeName().equals(SectionName)){
                //如果有相同的小结,则进一步判断是否有相同的键值名
                NodeList KeyNodeList = SectionNodeList.item(i).getChildNodes();
                //遍历小结下的键值
                for(int j = 0;j < KeyNodeList.getLength();j++){
                    if(KeyNodeList.item(j).getNodeName().equals(KeyName)){
                        //小结名下有相同的键值名,则直接修改对应的键值
                        KeyNodeList.item(j).setTextContent(KeyValue);
                        SaveXML(FileName);
                    }else{
                        //小结名下没有相同的键值名,则创建一个键值
                Element KeyElement = doc.createElement(KeyName);
                        KeyElement.setTextContent(KeyValue);
                        KeyNodeList.item(j).appendChild(KeyElement);
                        SaveXML(FileName);
                    }
                }
            }else{
                //如果没有相同的小结,则根据带入的形参创建一个新的小结
           Element SectionElement = doc.createElement(SectionName);
                Element KeyElement = doc.createElement(KeyName);
                KeyElement.setTextContent(KeyValue);
                SectionElement.appendChild(KeyElement);
                rootElement.appendChild(SectionElement);
                SaveXML(FileName);
            }        }
    }
     
         //保存文件
    public void SaveXML(String FileName){
        try{
            TransformerFactory tff = TransformerFactory.newInstance();
            Transformer tf = tff.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult rs = new StreamResult(FileName);
            tf.transform(source, rs);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
     
        //测试
    public static void main(String[] args){
        ReadWriteXML rwXML = new ReadWriteXML("e:/a1.xml");
        rwXML.WriteXML("JYGS", "IP","162.105.167.1");
    }
     
    private DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    private DocumentBuilder bulider;
    private Document doc;
    private String Value;
    private String FileName;
}
XML文件里是记录的数据连接信息,包括连接名,IP地址(IP),端口(PORT),连接字符集(CHARSET),默认数据(DBNAME)和数据类型(DBTYPE)

运行程序后并按照我的设想,即使插入相同的SectionName、不同的KeyName时,在a1.xml中也会创建一个新的SectionName;而不是我设想的只在SectionName下创建一个KeyName,请高手帮忙看看,最主要是WriteXML的for语句有问题。

TOP

用点xslt吧, 我们那点小鸡脑袋遍历xml还是有问题的,而且性能也不好

TOP

哈哈,昨晚重新改了程序,满足的需求,如果大家有这方面的应用,可以去我的blog看看。http://blog.csdn.net/misscai

TOP

不错

TOP

目前的方式很多。可以试用SDO/JAXB! 可以简化很多!不必写这多代码!
[size=4][b]-----孰能浊以静之徐清 孰能安以动之徐生-----[/b][/size] ---------------- [img]http://tmpimg.com/files/1538/fortiger.jpg[/img] [size=3][b][u][color=red]天神MM作品 版权所有 翻版必究[/color][/u][/b][/size]

TOP


感谢一直以来您对我们的支持!
当前时区 GMT+8, 现在时间是 2008-12-3 08:37 京ICP证060528 号

Designed By 17DST