C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C#操作XML

基于C#编写一个操作XML的简单类库XMLHelper

作者:BoiledYakult

这篇文章主要为大家详细介绍了如何基于C#编写一个操作XML的简单类库——XMLHelper,文中的示例代码讲解详细,需要的小伙伴可以参考一下

下午写了一个操作XML文件的类库,后来不用了,水篇文章存个档

整体功能

XMLHelper.cs主要提供以下功能:

没用 LINQ To XML 语法糖

XMLHelper.cs

using System;
using System.Data;
using System.Xml;
namespace XMLHelper
{
    class XMLHelper
    {
        private XmlDocument xmlDoc;
        public XMLHelper()
        {
            xmlDoc = new XmlDocument();
        }
        // 从文件路径或字符串中加载XML文档,并返回XmlDocument对象
        public XmlDocument LoadXmlDocumentFromFile(string filePath)
        {
            try
            {
                xmlDoc.Load(filePath);
                return xmlDoc;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error loading XML document from file: " + ex.Message);
                return null;
            }
        }
        // 从一个XML字符串加载XML文档,并返回XmlDocument对象
        public XmlDocument LoadXmlDocumentFromString(string xmlString)
        {
            try
            {
                xmlDoc.LoadXml(xmlString);
                return xmlDoc;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error loading XML document from string: " + ex.Message);
                return null;
            }
        }
        // 保存XML文件:将XmlDocument对象保存为XML文件
        public void SaveXmlDocument(XmlDocument xmlDoc, string filePath)
        {
            try
            {
                xmlDoc.Save(filePath);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error saving XML document: " + ex.Message);
            }
        }
        // 生成一个新的XML文件,并指定根节点名称
        public void GenerateXmlFile(string filePath, string rootElementName)
        {
            try
            {
                xmlDoc = new XmlDocument();
                XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null);
                XmlNode rootNode = xmlDoc.CreateElement(rootElementName);
                xmlDoc.AppendChild(xmlDeclaration);
                xmlDoc.AppendChild(rootNode);
                xmlDoc.Save(filePath);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error generating XML file: " + ex.Message);
            }
        }
        /// <summary>
        /// 读取XML文件到DataTable:将XML文件中的数据读取到DataTable对象中
        /// </summary>
        /// <param name="xmlDoc">XmlDocument对象</param>
        /// <param name="xpath">节点集合的 XPath 表达式 - 例如"/Roots/Child"</param>
        /// <returns>DataTable对象</returns>
        public DataTable ReadXmlToDataTable(XmlDocument xmlDoc,string xpath)
        {
            try
            {
                DataTable dataTable = new DataTable();
                XmlNodeList nodes = xmlDoc.SelectNodes(xpath);
                foreach (XmlNode node in nodes)
                {
                    if (dataTable.Columns.Count == 0)
                    {
                        foreach (XmlNode childNode in node.ChildNodes)
                        {
                            dataTable.Columns.Add(childNode.Name, typeof(string));
                        }
                    }
                    DataRow row = dataTable.NewRow();
                    foreach (XmlNode childNode in node.ChildNodes)
                    {
                        row[childNode.Name] = childNode.InnerText;
                    }
                    dataTable.Rows.Add(row);
                }
                return dataTable;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error reading XML document to DataTable: " + ex.Message);
                return null;
            }
        }
        /// <summary>
        /// 将DataTable对象中的数据更新到XML文件中
        /// </summary>
        /// <param name="xmlDoc">XmlDocument对象</param>
        /// <param name="dataTable">DataTable对象</param>
        /// <param name="elementName">子节点值</param>
        public void UpdateXmlFromDataTable(XmlDocument xmlDoc, DataTable dataTable,string elementName)
        {
            try
            {
                xmlDoc.DocumentElement.RemoveAll();
                foreach (DataRow row in dataTable.Rows)
                {
                    XmlElement measurementPointElement = xmlDoc.CreateElement(elementName);
                    foreach (DataColumn column in dataTable.Columns)
                    {
                        XmlElement element = xmlDoc.CreateElement(column.ColumnName);
                        element.InnerText = row[column.ColumnName].ToString();
                        measurementPointElement.AppendChild(element);
                    }
                    xmlDoc.DocumentElement.AppendChild(measurementPointElement);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error updating XML from DataTable: " + ex.Message);
            }
        }
        // 根据XPath表达式获取指定节点的值
        public string GetNodeValue(XmlDocument xmlDoc, string xpath)
        {
            XmlNode node = xmlDoc.SelectSingleNode(xpath);
            return node?.InnerText;
        }
        // 根据XPath表达式设置指定节点的值
        public void SetNodeValue(XmlDocument xmlDoc, string xpath, string value)
        {
            XmlNode node = xmlDoc.SelectSingleNode(xpath);
            if (node != null)
                node.InnerText = value;
        }
        // 根据XPath表达式和属性名称获取指定节点的属性值
        public string GetAttributeValue(XmlDocument xmlDoc, string xpath, string attributeName)
        {
            XmlNode node = xmlDoc.SelectSingleNode(xpath);
            if (node != null && node.Attributes != null)
            {
                XmlAttribute attribute = node.Attributes[attributeName];
                return attribute?.Value;
            }
            return null;
        }
        // 根据XPath表达式和属性名称设置指定节点的属性值
        public void SetAttributeValue(XmlDocument xmlDoc, string xpath, string attributeName, string value)
        {
            XmlNode node = xmlDoc.SelectSingleNode(xpath);
            if (node != null && node.Attributes != null)
            {
                XmlAttribute attribute = node.Attributes[attributeName];
                if (attribute != null)
                    attribute.Value = value;
            }
        }
        // 根据文件路径、XPath表达式和值更新XML文件中的节点值
        public void UpdateNodeValueInFile(string filePath, string xpath, string value)
        {
            XmlDocument doc = LoadXmlDocumentFromFile(filePath);
            if (doc != null)
            {
                SetNodeValue(doc, xpath, value);
                SaveXmlDocument(doc, filePath);
            }
        }
        // 根据文件路径、XPath表达式、属性名称和值更新XML文件中的属性值
        public void UpdateAttributeValueInFile(string filePath, string xpath, string attributeName, string value)
        {
            XmlDocument doc = LoadXmlDocumentFromFile(filePath);
            if (doc != null)
            {
                SetAttributeValue(doc, xpath, attributeName, value);
                SaveXmlDocument(doc, filePath);
            }
        }
    }
}

异常处理就需要大家自由发挥了

加载和保存XML文件

XMLHelper类库提供了两个方法,用于从文件路径或字符串中加载XML文档并返回XmlDocument对象,分别是:

public XmlDocument LoadXmlDocumentFromFile(string filePath)
public XmlDocument LoadXmlDocumentFromString(string xmlString)

可以使用这些方法将XML文件加载到XmlDocument对象中,方便后续的处理和操作,一个操作文件,一个操作XML结构的字符串,然后保存:

public void SaveXmlDocument(XmlDocument xmlDoc, string filePath)

这几个都是调用直接的方法,没什么可说的。

读取和更新XML文件

XMLHelper类库使得从XML文件中读取数据变得非常简单。其中,ReadXmlToDataTable方法允许将XML文件中的数据读取到DataTable对象中:

public DataTable ReadXmlToDataTable(XmlDocument xmlDoc, string xpath)

只需要提供XmlDocument对象和节点集合的XPath表达式(例如"/Roots/Child"),即可将XML文件中的数据读取到DataTable对象中。

另外,可以使用UpdateXmlFromDataTable方法将DataTable对象中的数据更新到XML文件中:

public void UpdateXmlFromDataTable(XmlDocument xmlDoc, DataTable dataTable, string elementName)

这个方法会清空XML文件并根据DataTable对象中的数据创建新的XML节点,并将其添加到XmlDocument对象中。

示例用法

// 创建XMLHelper对象
XMLHelper xmlHelper = new XMLHelper();
// 加载XML文件
XmlDocument xmlDoc = xmlHelper.LoadXmlDocumentFromFile("data.xml");
// 读取XML数据到DataTable
DataTable dataTable = xmlHelper.ReadXmlToDataTable(xmlDoc, "/Root/Element");
// 修改节点的值
dataTable.Rows[0]["Value"] = "New Value";
// 更新XML文件
xmlHelper.UpdateXmlFromDataTable(xmlDoc, dataTable, "Element");
// 保存XML文件
xmlHelper.SaveXmlDocument(xmlDoc, "data.xml");

读取和更新XML节点的值

XMLHelper还提供了一些方法用于读取和更新XML节点的值。以下是其中几个方法的示例:

string GetNodeValue(XmlDocument xmlDoc, string xpath)
public void SetNodeValue(XmlDocument xmlDoc, string xpath, string value)
public string GetAttributeValue(XmlDocument xmlDoc, string xpath, string attributeName)
public void SetAttributeValue(XmlDocument xmlDoc, string xpath, string attributeName, string value)

这些方法允许你根据XPath表达式获取节点的文本值或属性值,并且可以更新节点的文本值或属性值。

示例用法

// 创建XMLHelper对象
XMLHelper xmlHelper = new XMLHelper();
// 加载XML文件
XmlDocument xmlDoc = xmlHelper.LoadXmlDocumentFromFile("data.xml");
// 读取节点的值
string nodeValue = xmlHelper.GetNodeValue(xmlDoc, "/Root/Element/Value");
Console.WriteLine("Node Value: " + nodeValue);
// 更新节点的值
string newValue = "New Value";
xmlHelper.SetNodeValue(xmlDoc, "/Root/Element/Value", newValue);
Console.WriteLine("Node Value updated.");
// 保存XML文件
xmlHelper.SaveXmlDocument(xmlDoc, "data.xml");

生成XML文件

除了加载、读取和更新XML文件,XMLHelper类库还提供了一个方法用于生成XML文件。你可以使用GenerateXmlFile方法创建一个空的XML文件,指定根元素的名称和文件路径:

public void GenerateXmlFile(string filePath, string rootElementName)

这个有点瑕疵,后面用到再改哈。

设计思路

ChatGPT did this :

LoadXmlDocumentFromFile(string filePath): XmlDocument

LoadXmlDocumentFromString(string xmlString): XmlDocument

GenerateXmlFile(string filePath, string rootElementName): void

SaveXmlDocument(XmlDocument xmlDoc, string filePath): void

ReadXmlToDataTable(XmlDocument xmlDoc): DataTable

UpdateXmlFromDataTable(XmlDocument xmlDoc, DataTable dataTable, string elementName): void

GetNodeValue(XmlDocument xmlDoc, string xpath): string

SetNodeValue(XmlDocument xmlDoc, string xpath, string value): void

GetAttributeValue(XmlDocument xmlDoc, string xpath, string attributeName): string

SetAttributeValue(XmlDocument xmlDoc, string xpath, string attributeName, string value): void

UpdateNodeValueInFile(string filePath, string xpath, string value): void

UpdateAttributeValueInFile(string filePath, string xpath, string attributeName, string value): void

到此这篇关于基于C#编写一个操作XML的简单类库XMLHelper的文章就介绍到这了,更多相关C#操作XML内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文