C# XMl读写配置文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# XMl读写配置文件相关的知识,希望对你有一定的参考价值。

我可以手动建一个初始的配置文件,当然高手帮忙写下格式xml,大意是
serv_ip=192.168.0.1
connect_time=30
refresh_time=60
serv_port=3000
用xml写个格式吧先,实际然后程序启动界面会修改值,然后这里我想请教高手,
第一怎么读出来 复制给字段
第二 操作人员修改了字段 我怎么修改那些默认的参数xml 谢谢了

<config>
    <serv_ip>192.168.0.1</serv_ip>
    <connect_time>30</connect_time>
    <refresh_time>60</refresh_time>
    <serv_port>3000</serv_port>
</config>

一般像这样就行了 很简单的

或者多个配置你可以加个item标签如:

<config>
    <item>
        <serv_ip>192.168.0.1</serv_ip>
        <connect_time>30</connect_time>
        <refresh_time>60</refresh_time>
        <serv_port>3000</serv_port>
    </item>
    <item>
        <serv_ip>192.168.0.2</serv_ip>
        <connect_time>30</connect_time>
        <refresh_time>60</refresh_time>
        <serv_port>3000</serv_port>
    </item>
</config>

假定xml文件路径为:path

读取和保存:

using system.xml;

XmlDocument xml = new XmlDocument();//声明xml
xml.Load(path);//按路径读xml文件
xmlnode root=xml.selectsinglenode("config");//指向根节点
xmlnode xn=root.selectsinglenode("serv_ip");//指向根节点下的serv_ip节点
string ip=xn.innertext;//读出里面的值 注意读取的是string 需要类型转换的话自己做

//修改:
xn.innertext="192.168.2.2";
xml.save(path);//保存更改到路径

追问

你回答的很好你这个每次 单独找config 又单独找serv 很麻烦哦,能不能这样
我自己定义四个字段,一次从xml读出赋值, 修改后依次写入xml在保存 给个read 和write的方法可以吗??

追答

单独一个config是因为xml的格式要求的要有个根节点
要理解xml本质上你可以把它理解为一个树的结构 格式的要求没法省略

使用system.xml
不给类方法了 这么简单的 直接百度下怎么使用system.xml读写xml文件不会吗?

什么都给你做了还有什么意思

追问

我能说按照你的读 根本读不出来吗???string ip=xn.innertext;/ 调试不了

追答

自己看demo vs2010

还有注意大小写

追问

你之前给的xml 多了item ,还是谢谢,最后我想说,我要是百度的出来,我还问个“鸟8”!

追答

思考一下 item节点那个是为了让你做多个配置 到时候你就可以直接切换

研究一下xml的结构:

首先是:

<?xml version="1.0" encoding="utf-8" ?>

用来声明xml的版本和所使用的编码 可以有 也可以省略 省略的情况下就是默认utf-8编码

以下面这个为例:

<config>
    <item>
        <serv_ip>192.168.0.1</serv_ip>
        <connect_time>30</connect_time>
        <refresh_time>60</refresh_time>
        <serv_port>3000</serv_port>
    </item>
    <item>
        <serv_ip>192.168.0.2</serv_ip>
        <connect_time>30</connect_time>
        <refresh_time>60</refresh_time>
        <serv_port>3000</serv_port>
    </item>
</config>

我们可以把它画成树:

config是根节点 两个item是他的孩子节点 几个配置项就是item的孩子节点

xml就是这样来描述一个树结构数据的 然后百度下"system.xml"  找到msdn的内容 好好看看

一般只会用的xmlDocment 这些掌握了一般的xml操作也就没有什么问题了 

参考技术A

首先创建配置文件:config.xml

<?xml version="1.0" encoding="utf-8" ?>
<AppConfig xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ServerIPAddress>Configs\\ImportConfig\\FullImportConfig.xml</ServerIPAddress>
<ConnectTime>30</ConnectTime>
<RefreshTime>60</RefreshTime>
<ServerPort>3000</ServerPort>
</AppConfig>

追问

期待大神粗线!把xml格式也甩上来啊

追答

首先创建配置文件:config.xml

<?xml version="1.0" encoding="utf-8" ?>
<AppConfig>
<ServerIPAddress>192.168.0.1</ServerIPAddress>
<ConnectTime>30</ConnectTime>
<RefreshTime>60</RefreshTime>
<ServerPort>3000</ServerPort>
</AppConfig>

 再创建相关实体类:

public class AppConfig
    public string ServerIPAddress get;set;
    public int ConnectTime get;set;
    public int RefreshTime get;set;
    public int ServerPort get;set;

然后由实体提供Save和Load方法,就可以实现读到和写入了!

NND,说我超字数了,你追问下,我才能帖下面的代码了

追问

呵呵 大神指教下一步

追答

public static bool SaveConfig(string strConfigPath, T obj)


string strContent = XmlHelper.XmlSerialize(obj);
strConfigPath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, strConfigPath);
using (FileStream fileStream = new FileStream(strConfigPath, FileMode.Open, FileAccess.Write, FileShare.Read))

byte[] datas = new UTF8Encoding().GetBytes(strContent);
StreamWriter streamWriter = new StreamWriter(fileStream, System.Text.Encoding.UTF8);
fileStream.SetLength(datas.Length);
fileStream.Seek(0, SeekOrigin.Begin);
streamWriter.Write(strContent);
streamWriter.AutoFlush = true;
streamWriter.Flush();
streamWriter.Close();
fileStream.Close();

return true;

又超字符了,待续....

参考技术B xml里面不能放html

C#读取XML文件的基类实现

刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node.Attribute(name)方法,因此,想到结合之前所做的XML操作,完成了一个能够读取XML文件的基类,便于以后的使用。

PS:即使再老套的代码,目前也不敢进行优化,一是水平不行,二是不敢。

使用静态扩展类,扩展了几个经常使用的类型,能够方便数据的读写。

操作XML的类,可以直接继承BaseLinqXmlFileInfo,只需要设置protected类型的变量mPathName,mFileName,然后重写抽象方法即可实现XML文档的读取操作。

PS:能力有限,有不对之处请指正,谢谢。

  1 using System;
  2 using System.IO;
  3 using System.Xml.Linq;
  4 
  5 namespace Common
  6 {
  7     public abstract class BaseLinqXmlFileInfo
  8     {
  9         protected string mPathName;
 10 
 11         protected string mFileName;
 12 
 13         protected virtual string PathName
 14         {
 15             get { return mPathName; }
 16             set { mPathName = value; }
 17         }
 18 
 19         protected virtual string FileName
 20         {
 21             get { return mFileName; }
 22             set { mFileName = value; }
 23         }
 24 
 25         protected virtual string FilePathName
 26         {
 27             get
 28             {
 29                 return Path.Combine(PathName, FileName);
 30             }
 31         }
 32 
 33         public virtual bool Load()
 34         {
 35             bool result = false;
 36             try
 37             {
 38                 string filePathName = this.FilePathName;
 39                 if (File.Exists(filePathName))
 40                 {
 41                     this.LoadDocument(filePathName);
 42                     result = true;
 43                 }
 44             }
 45             catch(Exception ex)
 46             {
 47                 //异常信息输出
 48             }
 49             return result;
 50         }
 51 
 52         public virtual bool Save()
 53         {
 54             bool result = false;
 55             try
 56             {
 57 
 58                 string pathName = this.PathName;
 59                 if (!Directory.Exists(pathName))
 60                 {
 61                     Directory.CreateDirectory(PathName);
 62                 }
 63                 string tempFileName = "~" + FileName;
 64                 string tempfilePathName = Path.Combine(pathName, tempFileName);
 65                 this.SaveDocument(tempfilePathName);
 66                 string filePathName = Path.Combine(PathName, FileName);
 67                 if (File.Exists(filePathName))
 68                 {
 69                     FileAttributes att = File.GetAttributes(filePathName);
 70                     if((att & FileAttributes.ReadOnly)== FileAttributes.ReadOnly)
 71                     {
 72                         File.SetAttributes(filePathName, att & ~FileAttributes.ReadOnly);
 73                     }
 74                 }
 75                 File.Copy(tempfilePathName, filePathName, true);
 76                 if (File.Exists(tempfilePathName))
 77                 {
 78                     File.Delete(tempfilePathName);
 79                 }
 80                 result = true;
 81             }
 82             catch (Exception ex)
 83             {
 84                 //异常信息输出
 85             }
 86             return result;
 87         }
 88 
 89         private void LoadDocument(string fileName)
 90         {
 91             try
 92             {
 93                 XDocument doc = XDocument.Load(fileName);
 94                 this.ReadXml(doc);
 95             }
 96             catch(Exception ex)
 97             {
 98                 //异常信息输出
 99             }
100         }
101 
102         private void SaveDocument(string fileName)
103         {
104             try
105             {
106                 XDocument doc = new XDocument();
107                 this.WriteXml(doc);
108                 doc.Save(fileName);
109             }
110             catch(Exception ex)
111             {
112                 //异常信息输出
113             }
114         }
115 
116         private void ReadXml(XDocument doc)
117         {
118             XElement root = doc.Root;
119             this.ReadXml(root);
120         }
121 
122         private void WriteXml(XDocument doc)
123         {
124             XElement root = new XElement("root");
125             doc.Add(root);
126             this.WriteXml(root);
127         }
128 
129         protected abstract void ReadXml(XElement node);
130 
131         protected abstract void WriteXml(XElement node);
132     }
133 
134     public static class XMLSerializeExtensionClass
135     {
136         public static void Write(this XElement node,string name,string value)
137         {
138             node.SetAttributeValue(name, value);
139         }
140 
141         public static string ReadString(this XElement node, string name, string defaultValue)
142         {
143             XAttribute att = node.Attribute(name);
144             return att != null ? att.Value : defaultValue;
145         }
146 
147         public static void Write(this XElement node,string name,long value)
148         {
149             node.SetAttributeValue(name, value);
150         }
151 
152         public static long ReadLong(this XElement node,string name,long defaultValue)
153         {
154             XAttribute att = node.Attribute(name);
155             return att != null ? Convert.ToInt64(att.Value) : defaultValue;
156         }
157 
158         public static void Write(this XElement node,string name,decimal value)
159         {
160             node.SetAttributeValue(name, value);
161         }
162 
163         public static decimal ReadDecimal(this XElement node,string name,decimal defaultValue)
164         {
165             XAttribute att = node.Attribute(name);
166             return att != null ? Convert.ToDecimal(att.Value) : defaultValue;
167         }
168 
169         public static void Write(this XElement node ,string name,DateTime value)
170         {
171             node.SetAttributeValue(name, value);
172         }
173 
174         public static DateTime ReadDateTime(this XElement node,string name,DateTime defaultValue)
175         {
176             XAttribute att = node.Attribute(name);
177             return att != null ? Convert.ToDateTime(att.Value) : defaultValue;
178         }
179 
180         public static void Write(this XElement node,string name,int value)
181         {
182             node.SetAttributeValue(name, value);
183         }
184 
185         public static int ReadInt(this XElement node,string name,int defaultValue)
186         {
187             XAttribute att = node.Attribute(name);
188             return att != null ? Convert.ToInt32(att.Value) : defaultValue;
189         }
190 
191         public static void Write(this XElement node, string name,bool value)
192         {
193             node.SetAttributeValue(name, value);
194         }
195 
196         public static bool ReadBoolean(this XElement node, string name, bool defaultValue)
197         {
198             XAttribute att = node.Attribute(name);
199             return att != null ? Convert.ToBoolean(att.Value) : defaultValue;
200         }
201     }
202 }

 

以上是关于C# XMl读写配置文件的主要内容,如果未能解决你的问题,请参考以下文章

C#读取XML文件的基类实现

C# XML读写实例

C#中利用Windows的API读写配置参数文件

C# 读写App.config配置文件的方法

C#读写config配置文件

C# 读写App.config配置文件的方法