C# – XMLHelper :一个操作XML的简单类库

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

整体功能

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

  1. 加载XML文件:从文件路径或字符串中加载XML文档,并返回XmlDocument对象。
  2. 保存XML文件:将XmlDocument对象保存为XML文件。
  3. 读取XML文件到DataTable:将XML文件中的数据读取到DataTable对象中。
  4. 生成XML文件:生成一个新的XML文件,并指定根节点名称。
  5. DataTable更新XML文件:将DataTable对象中的数据更新到XML文件中。
  6. 获取节点值:根据XPath表达式获取指定节点的值。
  7. 设置节点值:根据XPath表达式设置指定节点的值。
  8. 获取属性值:根据XPath表达式和属性名称获取指定节点的属性值。
  9. 设置属性值:根据XPath表达式和属性名称设置指定节点的属性值。
  10. 更新文件中的节点值:根据文件路径、XPath表达式和值更新XML文件中的节点值。
  11. 更新文件中的属性值:根据文件路径、XPath表达式、属性名称和值更新XML文件中的属性值。

没用 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数据到DataTableDataTable 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

  1. LoadXmlDocumentFromFile(string filePath): XmlDocument
    • 功能:从指定文件路径加载XML文档。
    • 输入:文件路径。
    • 输出:加载成功返回XmlDocument对象,加载失败返回null。
    • 设计思路:使用XmlDocument的Load方法从文件路径加载XML文档,如果加载失败,则返回null。
  2. LoadXmlDocumentFromString(string xmlString): XmlDocument
    • 功能:从指定字符串加载XML文档。
    • 输入:XML字符串。
    • 输出:加载成功返回XmlDocument对象,加载失败返回null。
    • 设计思路:使用XmlDocument的LoadXml方法从字符串加载XML文档,如果加载失败,则返回null。
  3. GenerateXmlFile(string filePath, string rootElementName): void
    • 功能:生成一个新的XML文件,并指定根节点名称。
    • 输入:文件路径,根节点名称。
    • 输出:无。
    • 设计思路:创建一个新的XmlDocument对象,并使用指定的根节点名称创建根节点。然后使用XmlDocument的Save方法将XmlDocument对象保存为指定文件路径的XML文件。
  4. SaveXmlDocument(XmlDocument xmlDoc, string filePath): void
    • 功能:将XmlDocument对象保存为XML文件。
    • 输入:XmlDocument对象,文件路径。
    • 输出:无。
    • 设计思路:使用XmlDocument的Save方法将XmlDocument对象保存为指定文件路径的XML文件。
  5. ReadXmlToDataTable(XmlDocument xmlDoc): DataTable
    • 功能:将XML文件中的数据读取到DataTable对象中。
    • 输入:XmlDocument对象。
    • 输出:读取成功返回DataTable对象,读取失败返回null。
    • 设计思路:使用XmlDocument的SelectNodes方法选取指定XPath表达式的节点集合,遍历节点集合,并根据节点的子节点创建DataTable的列。然后遍历每个节点,将子节点的名称和文本内容作为DataTable的行数据。最后返回DataTable对象。
  6. UpdateXmlFromDataTable(XmlDocument xmlDoc, DataTable dataTable, string elementName): void
    • 功能:将DataTable对象中的数据更新到XML文件中。
    • 输入:XmlDocument对象,DataTable对象,要更新的节点元素名称。
    • 输出:无。
    • 设计思路:首先清空XmlDocument的根节点下的所有子节点。然后遍历DataTable的每一行,创建一个新的XmlElement,并根据DataTable的列名和行数据设置XmlElement的子节点。最后将新的XmlElement添加到XmlDocument的根节点下。
  7. GetNodeValue(XmlDocument xmlDoc, string xpath): string
    • 功能:根据XPath表达式获取指定节点的值。
    • 输入:XmlDocument对象,XPath表达式。
    • 输出:节点的值,如果节点不存在则返回null。
    • 设计思路:使用XmlDocument的SelectSingleNode方法根据XPath表达式选取指定节点,然后返回节点的InnerText。
  8. SetNodeValue(XmlDocument xmlDoc, string xpath, string value): void
    • 功能:根据XPath表达式设置指定节点的值。
    • 输入:XmlDocument对象,XPath表达式,要设置的值。
    • 输出:无。
    • 设计思路:使用XmlDocument的SelectSingleNode方法根据XPath表达式选取指定节点,然后将节点的InnerText设置为指定的值。
  9. GetAttributeValue(XmlDocument xmlDoc, string xpath, string attributeName): string
    • 功能:根据XPath表达式和属性名称获取指定节点的属性值。
    • 输入:XmlDocument对象,XPath表达式,属性名称。
    • 输出:属性的值,如果属性不存在则返回null。
    • 设计思路:使用XmlDocument的SelectSingleNode方法根据XPath表达式选取指定节点,然后根据属性名称获取属性的值。
  10. SetAttributeValue(XmlDocument xmlDoc, string xpath, string attributeName, string value): void
    • 功能:根据XPath表达式和属性名称设置指定节点的属性值。
    • 输入:XmlDocument对象,XPath表达式,属性名称,要设置的值。
    • 输出:无。
    • 设计思路:使用XmlDocument的SelectSingleNode方法根据XPath表达式选取指定节点,然后根据属性名称设置属性的值。
  11. UpdateNodeValueInFile(string filePath, string xpath, string value): void
    • 功能:根据文件路径、XPath表达式和值更新XML文件中的节点值。
    • 输入:文件路径,XPath表达式,要设置的值。
    • 输出:无。
    • 设计思路:首先从文件路径加载XML文档,然后调用SetNodeValue函数设置指定节点的值,最后保存XML文档到文件。
  12. UpdateAttributeValueInFile(string filePath, string xpath, string attributeName, string value): void
    • 功能:根据文件路径、XPath表达式、属性名称和值更新XML文件中的属性值。
    • 输入:文件路径,XPath表达式,属性名称,要设置的值。
    • 输出:无。
    • 设计思路:首先从文件路径加载XML文档,然后调用SetAttributeValue函数设置指定节点的属性值,最后保存XML文档到文件。

Done!!!

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYp8YWzP' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片