C#递归读写XML文件

由于所需要操作的XML文件结点格式不统一,故写了一个通用递归类,代码如下:

一、XML文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <Cycles>
      <SY_DT5_GSM_Month>5</SY_DT5_GSM_Month>
      <SY_DT5_GSM_Day>50</SY_DT5_GSM_Day>
    </Cycles>
  </appSettings>
  <Transmissions>
    <GSM>
      <SY_DT5_GSM Company="" Model="" COM="COM3">
        <YesterDay>2011-07-16</YesterDay>
        <LastMonth>
        </LastMonth>
      </SY_DT5_GSM>
    </GSM>
    <GRPS>
    </GRPS>
    <IP>
    </IP>
  </Transmissions>
  <connectionStrings>
    <Server>.</Server>
    <DataBase>Voltage</DataBase>
    <User>sa</User>
    <Pass>
    </Pass>
  </connectionStrings>
</configuration>

二、递归类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml;

/// <summary>
///XmlRWrite 的摘要说明
/// </summary>
public class XmlRWrite
{
    private string _FilePath;
    private string _ParentNode;
    private string _ChildName;
    private string _AttributeName;

    public XmlRWrite()
    {

    }

    /// <summary>
    /// XML文件存储路径
    /// </summary>
    public string FilePath
    {
        set
        {
            _FilePath = value;
        }
    }

    /// <summary>
    /// 父结点
    /// </summary>
    public string ParentNode
    {
        set
        {
            _ParentNode = value;
        }
    }

    /// <summary>
    /// 子结点
    /// </summary>
    public string ChildName
    {
        set
        {
            _ChildName = value;
        }
    }

    /// <summary>
    /// 结点属性
    /// </summary>
    public string AttributeName
    {
        set
        {
            _AttributeName = value;
        }
    }

    /// <summary>
    /// 递归读取XML文件结点值
    /// </summary>
    /// <param name="XNL">XmlNodeList列表</param>
    /// <returns>返回结点值</returns>
    private string ReadNodeValue(XmlNodeList XNL)
    {
        string Value = "";
        for (int i = 0; i < XNL.Count; i++)
        {
            if (Value != "")
                break;
            if (XNL[i].Name == _ParentNode)
            {
                foreach (XmlNode Childnode in XNL[i])
                {
                    if (Childnode.Name == _ChildName)
                    {
                        Value = Childnode.InnerText;
                        break;
                    }
                }
            }
            else
            {
                XmlNodeList xnl = XNL[i].ChildNodes;
                if (xnl.Count > 0)
                    Value = ReadNodeValue(xnl);
            }
        }
        return Value;
    }

    /// <summary>
    /// 递归读取XML文件结点属性值
    /// </summary>
    /// <param name="XNL">XmlNodeList列表</param>
    /// <returns>返回结点值</returns>
    private string ReadAttributeValue(XmlNodeList XNL)
    {
        string Value = "";
        for (int i = 0; i < XNL.Count; i++)
        {
            if (Value != "")
                break;
            if (XNL[i].Name == _ParentNode)
            {
                foreach (XmlNode Childnode in XNL[i])
                {
                    if (Childnode.Name == _ChildName)
                    {
                        Value = Childnode.Attributes[_AttributeName].Value;
                        break;
                    }
                }
            }
            else
            {
                XmlNodeList xnl = XNL[i].ChildNodes;
                if (xnl.Count > 0)
                    Value = ReadAttributeValue(xnl);
            }
        }
        return Value;
    }

    /// <summary>
    /// 递归设置结点值
    /// </summary>
    /// <param name="Value">结点值</param>
    /// <param name="XNL">XmlNodeList列表</param>
    private void WriteNodeValue(string Value, XmlNodeList XNL)
    {
        bool bl = false;
        for (int i = 0; i < XNL.Count; i++)
        {
            if (bl)
                break;
            if (XNL[i].Name == _ParentNode)
            {
                foreach (XmlNode Childnode in XNL[i])
                {
                    if (Childnode.Name == _ChildName)
                    {
                        Childnode.InnerText = Value;
                        bl = true;
                        break;
                    }
                }
            }
            else
            {
                XmlNodeList xnl = XNL[i].ChildNodes;
                if (xnl.Count > 0)
                    WriteNodeValue(Value, xnl);
            }
        }
    }

    /// <summary>
    /// 递归设置结点属性值
    /// </summary>
    /// <param name="Value">属性值</param>
    /// <param name="XNL">XmlNodeList列表</param>
    private void WriteAttributeValue(string Value, XmlNodeList XNL)
    {
        bool bl = false;
        for (int i = 0; i < XNL.Count; i++)
        {
            if (bl)
                break;
            if (XNL[i].Name == _ParentNode)
            {
                foreach (XmlNode Childnode in XNL[i])
                {
                    if (Childnode.Name == _ChildName)
                    {
                        Childnode.Attributes[_AttributeName].Value = Value;
                        bl = true;
                        break;
                    }
                }
            }
            else
            {
                XmlNodeList xnl = XNL[i].ChildNodes;
                if (xnl.Count > 0)
                    WriteAttributeValue(Value, xnl);
            }
        }
    }

    private XmlNodeList XNodeList()
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(_FilePath);
        XmlNodeList XNL = xmlDoc.SelectSingleNode("configuration").ChildNodes;
        return XNL;
    }

    /// <summary>
    /// 递归读取结点值
    /// </summary>
    /// <returns>返回值</returns>
    public string GetNodeValue()
    {
        XmlNodeList XNL = XNodeList();
        string Value = ReadNodeValue(XNL);       
        return Value;
    }

    /// <summary>
    /// 递归读取属性值
    /// </summary>
    /// <returns>返回值</returns>
    public string GetAttributeValue()
    {
        XmlNodeList XNL = XNodeList();
        string Value = ReadAttributeValue(XNL);
        return Value;
    }

    /// <summary>
    /// 递归设置结点值
    /// </summary>
    /// <param name="Value">结点值</param>
    public void SetNodeValue(string Value)
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(_FilePath);
        XmlNodeList XNL = xmlDoc.SelectSingleNode("configuration").ChildNodes;
        WriteNodeValue(Value, XNL);
        xmlDoc.Save(_FilePath);
    }

    /// <summary>
    /// 递归设置结点属性值
    /// </summary>
    /// <param name="Value">属性值</param>
    public void SetAttributeValue(string Value)
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(_FilePath);
        XmlNodeList XNL = xmlDoc.SelectSingleNode("configuration").ChildNodes;
        WriteAttributeValue(Value, XNL);
        xmlDoc.Save(_FilePath);
    }
}

三、使用方法

 protected void Button1_Click(object sender, EventArgs e)
    {
        string path = "C:\\Users\\Administrator\\Documents\\Visual Studio 2010\\WebSites\\WebSite2\\setup.xml";

        XmlRWrite xmlRWrite = new XmlRWrite();
        xmlRWrite.FilePath = path;

        //读取结点值
        xmlRWrite.ParentNode = "SY_DT5_GSM";
        xmlRWrite.ChildName = "YesterDay";
        LblMsg.Text = xmlRWrite.GetNodeValue();
        //读取属性值
        xmlRWrite.ParentNode = "GSM";
        xmlRWrite.ChildName = "SY_DT5_GSM";
        xmlRWrite.AttributeName = "COM";
        LblMsg.Text = xmlRWrite.GetAttributeValue();

        //设置结点值
        xmlRWrite.ParentNode = "SY_DT5_GSM";
        xmlRWrite.ChildName = "YesterDay";
        xmlRWrite.SetNodeValue("2011-07-16");
        //设置属性值
        xmlRWrite.ParentNode = "GSM";
        xmlRWrite.ChildName = "SY_DT5_GSM";
        xmlRWrite.AttributeName = "COM";
        xmlRWrite.SetAttributeValue("COM3");

    }
原文地址:https://www.cnblogs.com/easypass/p/2104640.html