c#操作xml文件示例

 更新时间:2014年03月12日 15:05:26   作者:  
对于XML读写操作,项目中经常要用到,之前木有好好总结过,例如LINQ TO XML也用过,这次无意发现XPATH对于XML的查询极为方便,索性把XML的操作总结以便后续方便使用

1. 新增XML文件

复制代码 代码如下:

XMLToolV2 _xmlHelper = new XMLToolV2(@"C:\20140311blogs.xml");//xml保存路径或者读取路径
 _xmlHelper.Create("Person", "utf-8");//跟节点名称:person;encode:utf-8
 XmlElement _person = _xmlHelper.CreateElec("Name", "Yan-Zhiwei");//在跟节点后创建person节点
 _xmlHelper.SetAttribute(_person, "Gender", "Man");//设置person节点属性Gender
 _xmlHelper.SetAttribute(_person, "Address", "shanghai");//设置person节点属性Address
 _xmlHelper.Save();//保存xml文件

上述代码实现效果:

那在Person节点继续增加节点,实现也很简单

复制代码 代码如下:

_xmlHelper.Create("Person", "utf-8");//跟节点名称:person;encode:utf-8
XmlElement _person = _xmlHelper.CreateElec("Name", "Yan-Zhiwei");//在跟节点后创建person节点
_xmlHelper.SetAttribute(_person, "Gender", "Man");//设置person节点属性Gender
_xmlHelper.SetAttribute(_person, "Address", "shanghai");//设置person节点属性Address
XmlElement _workLh = _xmlHelper.CreateElec(_person, "Work", "shanghai LH");//在person节点下增加work节点
_xmlHelper.SetAttribute(_workLh, "Year", "2013~");//设置work节点属性Title
XmlElement _workRK = _xmlHelper.CreateElec(_person, "Work", "shanghai Ranking");//在person节点下增加work节点
_xmlHelper.SetAttribute(_workRK, "Year", "2011~2013");//设置work节点属性Title
_xmlHelper.Save();//保存xml文件

上述代码实现效果:

2.读取节点的值,个人感觉xpath方式比linq to xml更为明了方便

复制代码 代码如下:

XMLToolV2 _xmlHelper = new XMLToolV2(@"C:\20140311blogs.xml");//xml保存路径或者读取路径
XmlNode _person = _xmlHelper.Select("Person/Name/text()");
Console.WriteLine("Name:" + _person.InnerText);
XmlNode _gender = _xmlHelper.Select("Person/Name[@Gender='Man']");
Console.WriteLine("Gender:" + _gender.Attributes["Gender"].Value);
Console.WriteLine("Address:" + _gender.Attributes["Address"].Value);
Console.WriteLine("-----------------------------");
XmlNodeList _workRecord = _xmlHelper.SelectNodeList("Person/Name/Work");
XMLToolV2.Loop(_workRecord, (XmlNode node) =>
{
    Console.WriteLine("Work:" + node.InnerText + " Year:" + node.Attributes["Year"].Value);
});


上述代码实现效果:

3.格式化显示XML

复制代码 代码如下:

XMLToolV2 _xmlHelper = new XMLToolV2(@"C:\20140311blogs.xml");//xml保存路径或者读取路径
string _xmlString = _xmlHelper.ShowXml();
Console.WriteLine(XMLToolV2.FormatXml(_xmlString, "utf-8"));


上述代码实现效果:

4.XMLToolV2源代码

复制代码 代码如下:

public class XMLToolV2
    {
        static string _xmlPath;
        static XmlDocument _xmlDoc { get; set; }
        static XmlElement _xmlRoot;


        public XMLToolV2(string xmlPath)
        {
            _xmlPath = xmlPath;
            LoadXmlDoc();
        }
        public XmlNode Select(string xPath)
        {
            if (string.IsNullOrEmpty(xPath))
                throw new ArgumentNullException("xPath");
            return _xmlDoc.SelectSingleNode(xPath);
        }
        public XmlNodeList SelectNodeList(string xPath)
        {
            if (string.IsNullOrEmpty(xPath))
                throw new ArgumentNullException("xPath");
            return _xmlDoc.SelectNodes(xPath);
        }
        public void Create(string rootName, string encode)
        {
            CreateXmlDoc(rootName, encode);
        }
        private void CreateXmlDoc(string rootName, string encode)
        {
            if (!File.Exists(_xmlPath))
            {
                if (string.IsNullOrEmpty(rootName))
                    throw new ArgumentNullException(rootName);
                _xmlDoc = new XmlDocument();
                XmlDeclaration _xmldecl = _xmlDoc.CreateXmlDeclaration("1.0", encode, null);
                _xmlDoc.AppendChild(_xmldecl);
                _xmlRoot = _xmlDoc.CreateElement("", rootName, "");
                _xmlDoc.AppendChild(_xmlRoot);
            }
        }
        public void LoadXmlDoc()
        {
            if (File.Exists(_xmlPath))
            {
                _xmlDoc = new XmlDocument();
                _xmlDoc.Load(_xmlPath);
                _xmlRoot = _xmlDoc.DocumentElement;
            }
        }
        public void Save()
        {
            if (_xmlDoc != null)
            {
                _xmlDoc.Save(_xmlPath);
            }
        }
        public XmlElement CreateElec(string elecName, string elecValue)
        {
            XmlElement _xElec = CreateElement(_xmlRoot, elecName, elecValue);
            return _xElec;
        }

        private XmlElement CreateElement(XmlNode _xmldocSelect, string elecName, string elecValue)
        {
            if (_xmldocSelect != null)
            {
                XmlElement _xElec = _xmlDoc.CreateElement(elecName);
                _xElec.InnerText = elecValue;
                _xmldocSelect.AppendChild(_xElec);
                return _xElec;
            }
            return null;
        }

        public XmlElement CreateElec(XmlElement xmlParentElec, string elecName, string elecValue)
        {
            if (xmlParentElec != null)
            {
                XmlElement _xElec = CreateElement(xmlParentElec, elecName, elecValue);
                return _xElec;
            }
            return null;
        }
        public void SetAttribute(XmlElement xElement, string attrName, string attrValue)
        {
            if (xElement != null)
            {
                xElement.SetAttribute(attrName, attrValue);
            }
        }
        public int Check(string xpath)
        {
            if (string.IsNullOrEmpty(xpath))
                throw new ArgumentNullException("xpath");
            return SelectNodeList(xpath).Count;
        }
        public string ShowXml()
        {
            if (_xmlDoc != null)
            {
                return _xmlDoc.OuterXml;
            }
            return string.Empty;
        }
        public static string FormatXml(string xmlString, string encode)
        {
            if (string.IsNullOrEmpty(xmlString))
                throw new ArgumentNullException("xmlString");
            if (string.IsNullOrEmpty(encode))
                throw new ArgumentNullException("encode");
            MemoryStream _mstream = new MemoryStream();
            XmlTextWriter _writer = new XmlTextWriter(_mstream, null);
            XmlDocument _xDoc = new XmlDocument();
            _writer.Formatting = Formatting.Indented;

            _xDoc.LoadXml(xmlString);
            _xDoc.WriteTo(_writer);
            _writer.Flush();
            _writer.Close();

            Encoding _encoding = Encoding.GetEncoding(encode);
            string _xmlString = _encoding.GetString(_mstream.ToArray());
            _mstream.Close();
            return _xmlString;
        }
        public static void Loop(XmlNodeList nodeList, Action<XmlNode> xmlNode)
        {
            if (nodeList != null)
            {
                foreach (XmlNode xNode in nodeList)
                {
                    xmlNode(xNode);
                }
            }
        }
    }

相关文章

  • c# SQLHelper(for winForm)实现代码

    c# SQLHelper(for winForm)实现代码

    数据连接池c# SQLHelper 实现代码
    2009-02-02
  • 详解c# Emit技术

    详解c# Emit技术

    这篇文章主要介绍了c# Emit技术的相关资料,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • C# 正则表达式进阶

    C# 正则表达式进阶

    这篇文章主要介绍了C# 正则表达式进阶,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C# TreeView读取数据库简单实例

    C# TreeView读取数据库简单实例

    这篇文章主要介绍了
    2013-12-12
  • C#制作多线程处理强化版网络爬虫

    C#制作多线程处理强化版网络爬虫

    这篇文章主要介绍了C#制作多线程处理强化版网络爬虫的相关代码,有想学习C#多线程编程的小伙伴可以参考下
    2016-09-09
  • C# 三种序列化方法分享

    C# 三种序列化方法分享

    这篇文章主要介绍了C# 三种序列化方法,需要的朋友可以参考下
    2014-02-02
  • WPF TextBox实现按字节长度限制输入功能

    WPF TextBox实现按字节长度限制输入功能

    这篇文章主要为大家详细介绍了WPF TextBox实现按字节长度限制输入功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • C#使用Aspose.Cells控件读取Excel

    C#使用Aspose.Cells控件读取Excel

    本文介绍Aspose.Cells基础的用法,供大家参考。
    2016-03-03
  • C#学习笔记之状态模式详解

    C#学习笔记之状态模式详解

    这篇文章主要为大家详细介绍了C#学习笔记之状态模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • C#串口通信总是丢数据的原因及解决方案

    C#串口通信总是丢数据的原因及解决方案

    在上位机开发中,串口通信是一个非常常见的通信方式,尤其是在与嵌入式设备、PLC、传感器等硬件设备进行交互时,串口通信简单、直接且广泛应用,但它也有自己的局限性,那么,为什么你的C#串口通信总是丢数据?本文将深度分析串口通信丢数据的原因,并提供一些有效的解决方案
    2025-02-02

最新评论