下午写了一个操作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数据到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

  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!!!

C# - XMLHelper :一个操作XML的简单类库的更多相关文章

  1. 自己写的一个操作Mysql的简单的实例

    #include <WinSock.h> #include <stdio.h> #include <iostream> #include <windows.h ...

  2. Spring Boot 使用 Dom4j XStream 操作 Xml

    Xml 现在仍然占据着比较重要的地位,比如微信接口中使用了 Xml 进行消息的定义.本章重点讨论 Xml 的新建.编辑.查找.转化,可以这么理解,本章是使用了 dom4j.xstream 也是在开发者 ...

  3. C#操作XML(读XML,写XML,更新,删除节点,与dataset结合等)【转载】

    已知有一个XML文件(bookstore.xml)如下: Corets, Eva 5.95 1.插入节点 往节点中插入一个节点: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  4. Qt操作xml文件(增删改功能)

    这个例子是在根据网上博客<Qt数据库(XML)>改写的一个操作XML的实现. 借鉴了很多里面的代码,大家可以结合上面的博客对照,相信你肯定会对XML的操作熟练起来. 我建立的是Qwidge ...

  5. C#操作Xml树的扩展类

    本文提供一个操作Xml树的扩展类,与将xml字符串直接映射成实体对象的使用方法,供大家参考,学习. 下面附上源码 using System; using System.Collections.Gene ...

  6. java操作xml的一个小例子

    最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...

  7. SqlServer简单的操作XML以及SQl的 try catch等统一格式

    1:SqlServer简单的操作XML: ALTER PROCEDURE [dbo].[SP_CRM_FranchiseeRecharge_Money] @Create_By VARCHAR(), @ ...

  8. Linq对XML的简单操作

    前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...

  9. XML系列之--对电文格式XML的简单操作(三)

    前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...

  10. C#操作xml完整类文件

    C#操作xml完整类文件 xml_oper.cs using ...System; using System.Data; using System.Web; using System.Xml; /** ...

随机推荐

  1. [Linux]CentOS查看RPM包依赖问题

    [经典应用案例] 查看此文前,可先查看 此博文中:在安装软件过程中,如何解决的依赖组件问题? [数据库/Linux]CentOS7安装MySQL Percona版(RPM方式) : 2-1 依赖组件问 ...

  2. SpringBoot线程池和Java线程池的实现原理

    使用默认的线程池 方式一:通过@Async注解调用 public class AsyncTest { @Async public void async(String name) throws Inte ...

  3. Nuxtjs实现服务端渲染和静态化站点

    本文将介绍如何使用Nuxtjs对vue项目进行ssr和静态化处理. Nuxtjs简单介绍 首先,我们简单了解下Nuxtjs框架,Nuxt.js是一个基于Vue的通用框架,主要用于解决Vue项目的服务端 ...

  4. ASP.NET Core Web API 流式返回,逐字显示

    Websocket.SSE(Server-Sent Events)和长轮询(Long Polling)都是用于网页和服务端通信的技术. Websocket是一种全双工通信协议,能够实现客户端和服务端之 ...

  5. Tars-Cpp 协程实现分析

    作者:vivo 互联网服务器团队- Ye Feng 本文介绍了协程的概念,并讨论了 Tars Cpp 协程的实现原理和源码分析. 一.前言 Tars 是 Linux 基金会的开源项目(https:// ...

  6. Django框架——可视化界面之数据增删改查、Django请求生命周期、Django路由层、反向解析

    可视化界面之数据增删改查 针对数据对象主键字段的获取可以使用更加方便的 obj.pk获取 在模型类中定义双下str方法可以在数据对象被执行打印操作的时候方便的查看 ''' form表单中能够触发调剂动 ...

  7. Qt+MySql开发笔记:Qt5.9.3的msvc2017x64版本编译MySql8.0.16版本驱动并Demo连接数据库测试

    前言   mysql驱动版本msvc2015x32版本调好, mysql的mingw32版本的驱动上一个版本编译并测试好,有些三方库最低支持vs2017,所以只能使用msvc2017x64,基于Qt5 ...

  8. Prism Sample 1

    这个样例版本上已经过时了,但与8.1版本仍然兼容. 在本版本中,指定启动项: App.xaml.cs: protected override void OnStartup(StartupEventAr ...

  9. 基于APM模式的异步实现及跨线程操作窗体或控件方法的实现示例

    最近在一家某电力外派公司开发相关于GIS的功能,在实现代码的过程中出现了一些常见的问题比如: 1.跨线程执行窗体或控件操作(直接使用委拖) 2.异步模式执行某长时间耗时方法 经过一系列摸索可算找到解决 ...

  10. 2021-02-06:假设字符串str长度为N,请问最长回文子串的长度是多少?

    福哥答案2021-02-06: 1.动态规划.无代码,见图.2.中心扩展法.无代码.3.Manacher算法.有代码,见图.1)理解回文半径数组.2)理解所有中心的回文最右边界R,和取得R时的中心点C ...