小弟最近写个
程序,用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语句有问题。