背景:

在工作中,学习和使用OPC Server/Client系统时,发现开发的设计结构是把设备PLC的TAGLIST写为XML文件,在程序启动的时候载入从而完成自动配置。

从而开始了C# ASP.NET中的XML文件的相关学习。

学习笔记:

1>简述:

XML是可扩展标记语言 ,使用元素和属性来描述数据。

c#使用XML好处:
A.其实就是为程序交互提供的一种通用的数据格式,无论用什么语言编写的程序都可以通过XML交换数据,意味着C#对象可以和一个JAVA对象通讯;

B.可作为一种存储数据的手段,相当于一个小的数据源,作为配置文件用,比.INI优秀并易用。格式固定,修改方便。
2>xml常用操作:

//命名空间

using System.Xml;

//初始化一个xml实例

XmlDocument xml=new XmlDocument();

//导入指定xml文件xml.Load(path);

xmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory + "\\" + XMLfile);

//指定一个节点

XmlNode root=xml.SelectSingleNode("/root");

//获取节点下所有直接子节点

XmlNodeList childlist=root.ChildNodes;

//判断该节点下是否有子节点

root.HasChildNodes;

//获取同名同级节点集合

XmlNodeList nodelist=xml.SelectNodes("/Root/News");

//生成一个新节点

XmlElement node=xml.CreateElement("News");

//将节点加到指定节点下,作为其子节点

root.AppendChild(node);

//将节点加到指定节点下某个子节点前

root.InsertBefore(node,root.ChildeNodes[i]);

//为指定节点的新建属性并赋值

node.SetAttribute("id","11111");

//为指定节点添加子节点

root.AppendChild(node);

//获取指定节点的指定属性值

string id=node.Attributes["id"].Value;

//获取指定节点中的文本

string content=node.InnerText;

//保存XML文件

xml.Save(path);

3>如何从winform写入数据到XML文件

个人总结为动态写入和静态写入,可以直接在程序中hard-coding XML元素的各节点,也可以从TEXT获取写入,

还可以从数据库(opc S/C系统是从OPC SERVER读取TAGLIST到DATASET再存数XML)读取到DATASET然后再写入XML文件。

下面练习代码属于第二种:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;//FileStream namespace WinForm_CreateXML
{
public partial class Form1 : Form
{ private string XMLfile; XmlDocument xmlDoc = new XmlDocument(); public XmlNode root; public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
XMLfile = "Test.xml";
//创建XML文件
CreateXML(XMLfile);
} /// <summary>
/// 创建XML文件的函数
/// </summary>
/// <param name="FileName"></param>
public static void CreateXML(string FileName)
{
string DataPath = AppDomain.CurrentDomain.BaseDirectory;
FileStream objFileStream = null;
StreamWriter objStreamWriter = null;
try
{
//判断文件是否存在,如果存在就覆盖
if(File.Exists(DataPath+FileName))
{
return;
}
objFileStream =new FileStream(DataPath+FileName,FileMode.Append,FileAccess.Write);
objStreamWriter =new StreamWriter(objFileStream,Encoding.Default);
objStreamWriter.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
objStreamWriter.WriteLine("<root>\r\n</root>");//将字符串写入到文件中 }
catch (Exception ex)
{ }
finally
{
if (objStreamWriter != null)
{
objStreamWriter.Flush();//清理缓冲区
objStreamWriter.Close();//关闭对象和基础流 } } } /// <summary>
/// 添加节点xmlnode的函数
/// </summary>
public void addnode()
{
XmlNode WebSite = xmlDoc.CreateElement("webSite"); XmlAttribute sitename1 = xmlDoc.CreateAttribute("sitename");
sitename1.Value = sitename.Text.Trim();
WebSite.Attributes.Append(sitename1);
WebSite.InnerText = sitename.Text.Trim(); XmlAttribute siteurl1 = xmlDoc.CreateAttribute("siteurl");
siteurl1.Value = siteurl.Text.Trim();
WebSite.Attributes.Append(siteurl1); xmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory + "\\" + XMLfile);//***一定需要先打开XML文件*** root = xmlDoc.SelectSingleNode("root");//选择匹配的第一个XMLNODE
//root = xmlDoc.GetElementById("root");
root.AppendChild(WebSite);
xmlDoc.AppendChild(root);
xmlDoc.Save(XMLfile);
} private void button1_Click(object sender, EventArgs e)
{
//addnode();
checknode();
MessageBox.Show("请到当前路径下的XML查看!"); } /// <summary>
/// 检查在网站名称处输入的sitename如果节点中存在则修改,如果不存在就修改此节点的siturl
/// </summary>
public void checknode()
{
int j = ; xmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory + "\\" + XMLfile);//***一定需要先打开XML文件***
XmlNodeList nodelist = xmlDoc.SelectSingleNode("root").ChildNodes;//获取root根节点的所有子节点
foreach (XmlNode xn in nodelist)
{
XmlElement xe = (XmlElement)xn;//将节点类型转换为XmlElement类型
if(xe.GetAttribute("sitename")==sitename.Text.Trim())
{
j = ;
xe.SetAttribute("siteurl", siteurl.Text.Trim());
break;//结束整个循环体,continue是结束单次循环 } } if (j == )
{
addnode();
MessageBox.Show("添加成功"); }
else
{
xmlDoc.Save(XMLfile);
MessageBox.Show("修改成功");
} }
/// <summary>
/// 删除sitename文本框中的在xml节点中已存在此网站名的节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
xmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory + "\\" + XMLfile);//***一定需要先打开XML文件***
root = xmlDoc.SelectSingleNode("root");
XmlNodeList nodelist = xmlDoc.SelectSingleNode("root").ChildNodes;//获取所有子节点
foreach(XmlNode xn in nodelist)
{
XmlElement xe =(XmlElement)xn;
if(xe.GetAttribute("sitename")==sitename.Text.Trim())
{
root.RemoveChild(xe);
break; }
}
xmlDoc.Save(XMLfile);
MessageBox.Show("删除成功");
}
}
}

注:楼主菜鸟,大家一起学习~

C# Winform --xml文件的更多相关文章

  1. WinForm中使用XML文件存储用户配置及操作本地Config配置文件

    大家都开发winform程序时候会大量用到配置App.config作为保持用户设置的基本信息,比如记住用户名,这样的弊端就是每个人一些个性化的设置每次更新程序的时候会被覆盖. 故将配置文件分两大类: ...

  2. c#读取xml文件配置文件Winform及WebForm-Demo具体解释

    我这里用Winform和WebForm两种为例说明怎样操作xml文档来作为配置文件进行读取操作. 1.新建一个类,命名为"SystemConfig.cs".代码例如以下: < ...

  3. WinForm中DataGridView对XML文件的读取

    转自http://www.cnblogs.com/a1656344531/archive/2012/11/28/2792863.html c#读取XML   XML文件是一种常用的文件格式,例如Win ...

  4. Winform中对xml文件进行保存时空白节点自动换行问题的解决

    场景 Winform中自定义xml配置文件后对节点进行读取与写入: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10053213 ...

  5. 在asp.net 中应用POST传递和接收XML文件以及参数.(转)

    使用POST方式可以向别的页面发送请求,并获取返回结果. 可以从一个页面发送POST到另一个页面,也可以在winform工程中使用HTTPRequest发送POST到一个页面.我们拿ASP.NET的a ...

  6. 使用XmlReader读取xml文件之二

    在.net开发中经常需要读写xml形式的文件(app.config和web.config分别是WinForm和WebForm中使用到的 xml文件的一个特列,并且微软提供了通用的方法,在此就不赘述了) ...

  7. C#中经常使用的几种读取XML文件的方法

    XML文件是一种经常使用的文件格式,比如WinForm里面的app.config以及Web程序中的web.config文件,还有很多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖 ...

  8. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  9. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件

    通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二).   前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...

随机推荐

  1. 第一次做C++项目的一点小总结

    本人原本一菜鸟java程序员,但业余涉猎还算广泛,稍微了解些C++内容.主要之前曾爱好过汇编语言.所以对于C语言能从汇编层面加以理解,C++则是在此基础上又加了面向对象.stl等一类东西嘛. 这次做了 ...

  2. Android零基础入门第75节:Activity状态和生命周期方法

    前面两期我们学习了Activity的创建和注册.以及启动和关闭,也学会了重写onCraete方法,这些知识在实际开发中远远不够,还需要学习了解更多. 生命周期就是一个对象从创建到销毁的过程,每一个对象 ...

  3. UBUNTU 16.04 + CUDA8.0 + CUDNN6.0 + OPENCV3.2 + MKL +CAFFE + tensorflow

    首先说一下自己机子的配置 CPU:Intel(R) Core(TM) i5-5600 CUP @3.20GHz *4 GPU : GTX 1060 OS : 64bit Ubuntu16.04LTS ...

  4. 一种基于Qt的可伸缩的全异步C/S架构服务器实现(一) 综述

    本文向大家介绍一种基于Qt的伸缩TCP服务实现.该实现针对C/S客户端-服务集群应用需求而搭建.连接监听.数据传输.数据处理均在独立的线程池中进行,根据特定任务不同,可安排负责监听.传输.处理的线程数 ...

  5. Scintilla开源库使用指南

    http://www.cnblogs.com/superanyi/archive/2011/04/07/2008636.html http://download.csdn.net/detail/den ...

  6. 用 eric6 与 PyQt5 实现python的极速GUI编程(35篇PyQT和200多篇Python)

    [题记] 我是一个菜鸟,这个系列是我的学习笔记. PyQt5 出来有一段时间了, PyQt5 较之 PyQt4 有一些变化,而网上流传的几乎都是 PyQt4 的教程,照搬的话大多会出错. eric6 ...

  7. c#实现类似数据的行锁

    当我们有一些这样的需求,比如某个订单中下单,修改等等这些是单例执行的,不能同步操作,当然这样的情况你可以使用数据库的行锁来实现,但是我们代码里面实现的话 ,我们也要用到锁,大部分情况下我们使用lock ...

  8. How Qt Signals and Slots Work(感觉是通过Meta根据名字来调用)

    Qt is well known for its signals and slots mechanism. But how does it work? In this blog post, we wi ...

  9. 窗体图片背景(两种方法:设置Brush.Bitmap指向图片,别的控件也可以这样)

    var   Bitmap: TBitmap; procedure TForm1.FormCreate(Sender: TObject); begin   Bitmap := TBitmap.Creat ...

  10. Qt Style Sheet实践(二):组合框QComboBox的定制(24K纯开源)——非常漂亮

    组合框是一个重要且应用广泛的组件,一般由两个子组件组成:文本下拉单部分和按钮部分.在许多既需要用户选择.又需要用户手动输入的应用场景下,组合框能够很好的满足我们的需求.如我们经常使用的聊天软件QQ登录 ...