上一篇: 下一篇:

用XmlDocument操作xml文件[初级模式]

2007年03月2日  |  1:00 下午分类:Develop  |  

不管是在web应用还是桌面程序中,很多地方都会用xml来做一些配置,如你现在所看到的Blog也是用的xml文件作相关配置
首先,我们可以把一个类设为可序列化,然后保存到一个物理磁盘上,读取时再进行反序列化为该类,就可以读取相应的数据了。

[Serializable]
public class ConfigModule
{
public ConfigModule()
{
//
// TODO: 在此处添加构造函数逻辑
//

}

bool blogstate;
[XmlElement]
public bool BlogState
{
get { return blogstate; }
set { this.blogstate = value; }
}
/////......................
}

序列化该类并保存:

public static void SaveConfigModule(ConfigModule data)
{
HttpContext context = HttpContext.Current;
string configfile = context.Server.MapPath(ConfigurationManager.AppSettings["configFile"]);
XmlSerializer serializer = new XmlSerializer(typeof(ConfigModule));
FileStream fs = new FileStream(configfile, FileMode.Create);
serializer.Serialize(fs, data);
fs.Close();
}

读取时进行反序列化。
但这样有一个弊端:就是每增加一个Xml节点时都要改动该类,比较麻烦,如果该xml有20多个节点,那ConfigModule中就有20多个相关的属性。

这里,我们用XmlDocument类来处理会方便很多。
XMLDocument------遵循W3C文档对象模型规范的一级和二级标准,实现XML数据随机的、有缓存的存取。一级水平包含了DOM的最基本的部分,而二级水平增加多种改进,包括增加了对名称空间和级连状图表(CSS)的支持。
假定现在要处理下面的xml文件内容,

<?xml version="1.0" encoding="utf-8"?>
<Config>
<SiteName>tetete</SiteName>
<SiteURL>wwwww</SiteURL>
<ttt>ttt</ttt>
<asdf>asdfasdf</asdf>
<aaaa>aaaa</aaaa>
<bbb>bbb</bbb>
<ccc>ccc</ccc>
<dd>ddd</dd>
</Config>

读取:

StringBuilder sb = new StringBuilder();
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("~/demo.xml"));
foreach (XmlNode node in doc.ChildNodes[1].ChildNodes)
{
sb.Append("节点名:" + node.Name + ",节点值:" + node.InnerText + "<br />");
}
this.Main.Text = sb.ToString();

注意这里的doc.ChildNodes会返回2,doc.ChildNodes[0]会返回xml的声明,即:xml version="1.0"
要访问Config下的子节点,就应该是doc.ChildNodes[1].ChildNodes,此时返回的是XmlNodeList,遍历该XmlNodeList就可以得到单独的XmlNode了

修改某一个节点的值:
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("~/demo.xml"));
doc.GetElementsByTagName("SiteName")[0].InnerText = "新值";
doc.Save(Server.MapPath("~/demo.xml"));
首先要找到要修改的NodeList,然后直接修改其InnerText属性的值,最后Save一下就行了。
XmlDocument.GetElementsByTagName()会返回一个XmlNodeList,因为SiteName只有一个,所以doc.GetElementsByTagName("SiteName")[0]将直接
返回我们需要的XmlNode。

删除某一个节点:
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("~/demo.xml"));
doc.ChildNodes[1].RemoveChild(doc.GetElementsByTagName("ccc")[0]); //移除ccc这个节点
doc.Save(Server.MapPath("~/demo.xml"));
当然,如果只是读取xml,用XmlReader会更快速。

转载时务必以超链接形式标明文章原始出处和作者信息。

相关文章

  • 暂无相关日志

发表您的评论

1410168172122013183195114157619