基于C#編寫一個操作XML的簡單類庫XMLHelper
下午寫了一個操作XML
文件的類庫,后來不用了,水篇文章存?zhèn)€檔
整體功能
XMLHelper.cs
主要提供以下功能:
- 加載XML文件:從文件路徑或字符串中加載XML文檔,并返回
XmlDocument
對象。 - 保存XML文件:將XmlDocument對象保存為XML文件。
- 讀取XML文件到
DataTable
:將XML文件中的數(shù)據(jù)讀取到DataTable
對象中。 - 生成XML文件:生成一個新的XML文件,并指定根節(jié)點名稱。
- 從
DataTable
更新XML文件:將DataTable
對象中的數(shù)據(jù)更新到XML文件中。 - 獲取節(jié)點值:根據(jù)XPath表達(dá)式獲取指定節(jié)點的值。
- 設(shè)置節(jié)點值:根據(jù)XPath表達(dá)式設(shè)置指定節(jié)點的值。
- 獲取屬性值:根據(jù)XPath表達(dá)式和屬性名稱獲取指定節(jié)點的屬性值。
- 設(shè)置屬性值:根據(jù)XPath表達(dá)式和屬性名稱設(shè)置指定節(jié)點的屬性值。
- 更新文件中的節(jié)點值:根據(jù)文件路徑、XPath表達(dá)式和值更新XML文件中的節(jié)點值。
- 更新文件中的屬性值:根據(jù)文件路徑、XPath表達(dá)式、屬性名稱和值更新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文件,并指定根節(jié)點名稱 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文件中的數(shù)據(jù)讀取到DataTable對象中 /// </summary> /// <param name="xmlDoc">XmlDocument對象</param> /// <param name="xpath">節(jié)點集合的 XPath 表達(dá)式 - 例如"/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對象中的數(shù)據(jù)更新到XML文件中 /// </summary> /// <param name="xmlDoc">XmlDocument對象</param> /// <param name="dataTable">DataTable對象</param> /// <param name="elementName">子節(jié)點值</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); } } // 根據(jù)XPath表達(dá)式獲取指定節(jié)點的值 public string GetNodeValue(XmlDocument xmlDoc, string xpath) { XmlNode node = xmlDoc.SelectSingleNode(xpath); return node?.InnerText; } // 根據(jù)XPath表達(dá)式設(shè)置指定節(jié)點的值 public void SetNodeValue(XmlDocument xmlDoc, string xpath, string value) { XmlNode node = xmlDoc.SelectSingleNode(xpath); if (node != null) node.InnerText = value; } // 根據(jù)XPath表達(dá)式和屬性名稱獲取指定節(jié)點的屬性值 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; } // 根據(jù)XPath表達(dá)式和屬性名稱設(shè)置指定節(jié)點的屬性值 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; } } // 根據(jù)文件路徑、XPath表達(dá)式和值更新XML文件中的節(jié)點值 public void UpdateNodeValueInFile(string filePath, string xpath, string value) { XmlDocument doc = LoadXmlDocumentFromFile(filePath); if (doc != null) { SetNodeValue(doc, xpath, value); SaveXmlDocument(doc, filePath); } } // 根據(jù)文件路徑、XPath表達(dá)式、屬性名稱和值更新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); } } } }
異常處理就需要大家自由發(fā)揮了
加載和保存XML文件
XMLHelper
類庫提供了兩個方法,用于從文件路徑或字符串中加載XML文檔并返回XmlDocument
對象,分別是:
public XmlDocument LoadXmlDocumentFromFile(string filePath)
public XmlDocument LoadXmlDocumentFromString(string xmlString)
可以使用這些方法將XML文件加載到XmlDocument
對象中,方便后續(xù)的處理和操作,一個操作文件,一個操作XML結(jié)構(gòu)的字符串,然后保存:
public void SaveXmlDocument(XmlDocument xmlDoc, string filePath)
這幾個都是調(diào)用直接的方法,沒什么可說的。
讀取和更新XML文件
XMLHelper
類庫使得從XML文件中讀取數(shù)據(jù)變得非常簡單。其中,ReadXmlToDataTable
方法允許將XML文件中的數(shù)據(jù)讀取到DataTable
對象中:
public DataTable ReadXmlToDataTable(XmlDocument xmlDoc, string xpath)
只需要提供XmlDocument
對象和節(jié)點集合的XPath
表達(dá)式(例如"/Roots/Child"
),即可將XML文件中的數(shù)據(jù)讀取到DataTable
對象中。
另外,可以使用UpdateXmlFromDataTable
方法將DataTable
對象中的數(shù)據(jù)更新到XML文件中:
public void UpdateXmlFromDataTable(XmlDocument xmlDoc, DataTable dataTable, string elementName)
這個方法會清空XML文件并根據(jù)DataTable
對象中的數(shù)據(jù)創(chuàng)建新的XML節(jié)點,并將其添加到XmlDocument
對象中。
示例用法
// 創(chuàng)建XMLHelper對象 XMLHelper xmlHelper = new XMLHelper(); // 加載XML文件 XmlDocument xmlDoc = xmlHelper.LoadXmlDocumentFromFile("data.xml"); // 讀取XML數(shù)據(jù)到DataTable DataTable dataTable = xmlHelper.ReadXmlToDataTable(xmlDoc, "/Root/Element"); // 修改節(jié)點的值 dataTable.Rows[0]["Value"] = "New Value"; // 更新XML文件 xmlHelper.UpdateXmlFromDataTable(xmlDoc, dataTable, "Element"); // 保存XML文件 xmlHelper.SaveXmlDocument(xmlDoc, "data.xml");
讀取和更新XML節(jié)點的值
XMLHelper
還提供了一些方法用于讀取和更新XML節(jié)點的值。以下是其中幾個方法的示例:
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)
這些方法允許你根據(jù)XPath
表達(dá)式獲取節(jié)點的文本值或?qū)傩灾?,并且可以更新?jié)點的文本值或?qū)傩灾怠?/p>
示例用法
// 創(chuàng)建XMLHelper對象 XMLHelper xmlHelper = new XMLHelper(); // 加載XML文件 XmlDocument xmlDoc = xmlHelper.LoadXmlDocumentFromFile("data.xml"); // 讀取節(jié)點的值 string nodeValue = xmlHelper.GetNodeValue(xmlDoc, "/Root/Element/Value"); Console.WriteLine("Node Value: " + nodeValue); // 更新節(jié)點的值 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
方法創(chuàng)建一個空的XML文件,指定根元素的名稱和文件路徑:
public void GenerateXmlFile(string filePath, string rootElementName)
這個有點瑕疵,后面用到再改哈。
設(shè)計思路
ChatGPT did this :
LoadXmlDocumentFromFile(string filePath): XmlDocument
- 功能:從指定文件路徑加載XML文檔。
- 輸入:文件路徑。
- 輸出:加載成功返回XmlDocument對象,加載失敗返回null。
- 設(shè)計思路:使用XmlDocument的
Load
方法從文件路徑加載XML文檔,如果加載失敗,則返回null。
LoadXmlDocumentFromString(string xmlString): XmlDocument
- 功能:從指定字符串加載XML文檔。
- 輸入:XML字符串。
- 輸出:加載成功返回XmlDocument對象,加載失敗返回null。
- 設(shè)計思路:使用XmlDocument的
LoadXml
方法從字符串加載XML文檔,如果加載失敗,則返回null。
GenerateXmlFile(string filePath, string rootElementName): void
- 功能:生成一個新的XML文件,并指定根節(jié)點名稱。
- 輸入:文件路徑,根節(jié)點名稱。
- 輸出:無。
- 設(shè)計思路:創(chuàng)建一個新的XmlDocument對象,并使用指定的根節(jié)點名稱創(chuàng)建根節(jié)點。然后使用XmlDocument的
Save
方法將XmlDocument對象保存為指定文件路徑的XML文件。
SaveXmlDocument(XmlDocument xmlDoc, string filePath): void
- 功能:將XmlDocument對象保存為XML文件。
- 輸入:XmlDocument對象,文件路徑。
- 輸出:無。
- 設(shè)計思路:使用XmlDocument的
Save
方法將XmlDocument對象保存為指定文件路徑的XML文件。
ReadXmlToDataTable(XmlDocument xmlDoc): DataTable
- 功能:將XML文件中的數(shù)據(jù)讀取到DataTable對象中。
- 輸入:XmlDocument對象。
- 輸出:讀取成功返回DataTable對象,讀取失敗返回null。
- 設(shè)計思路:使用XmlDocument的
SelectNodes
方法選取指定XPath表達(dá)式的節(jié)點集合,遍歷節(jié)點集合,并根據(jù)節(jié)點的子節(jié)點創(chuàng)建DataTable的列。然后遍歷每個節(jié)點,將子節(jié)點的名稱和文本內(nèi)容作為DataTable的行數(shù)據(jù)。最后返回DataTable對象。
UpdateXmlFromDataTable(XmlDocument xmlDoc, DataTable dataTable, string elementName): void
- 功能:將DataTable對象中的數(shù)據(jù)更新到XML文件中。
- 輸入:XmlDocument對象,DataTable對象,要更新的節(jié)點元素名稱。
- 輸出:無。
- 設(shè)計思路:首先清空XmlDocument的根節(jié)點下的所有子節(jié)點。然后遍歷DataTable的每一行,創(chuàng)建一個新的XmlElement,并根據(jù)DataTable的列名和行數(shù)據(jù)設(shè)置XmlElement的子節(jié)點。最后將新的XmlElement添加到XmlDocument的根節(jié)點下。
GetNodeValue(XmlDocument xmlDoc, string xpath): string
- 功能:根據(jù)XPath表達(dá)式獲取指定節(jié)點的值。
- 輸入:XmlDocument對象,XPath表達(dá)式。
- 輸出:節(jié)點的值,如果節(jié)點不存在則返回null。
- 設(shè)計思路:使用XmlDocument的
SelectSingleNode
方法根據(jù)XPath表達(dá)式選取指定節(jié)點,然后返回節(jié)點的InnerText。
SetNodeValue(XmlDocument xmlDoc, string xpath, string value): void
- 功能:根據(jù)XPath表達(dá)式設(shè)置指定節(jié)點的值。
- 輸入:XmlDocument對象,XPath表達(dá)式,要設(shè)置的值。
- 輸出:無。
- 設(shè)計思路:使用XmlDocument的
SelectSingleNode
方法根據(jù)XPath表達(dá)式選取指定節(jié)點,然后將節(jié)點的InnerText設(shè)置為指定的值。
GetAttributeValue(XmlDocument xmlDoc, string xpath, string attributeName): string
- 功能:根據(jù)XPath表達(dá)式和屬性名稱獲取指定節(jié)點的屬性值。
- 輸入:XmlDocument對象,XPath表達(dá)式,屬性名稱。
- 輸出:屬性的值,如果屬性不存在則返回null。
- 設(shè)計思路:使用XmlDocument的
SelectSingleNode
方法根據(jù)XPath表達(dá)式選取指定節(jié)點,然后根據(jù)屬性名稱獲取屬性的值。
SetAttributeValue(XmlDocument xmlDoc, string xpath, string attributeName, string value): void
- 功能:根據(jù)XPath表達(dá)式和屬性名稱設(shè)置指定節(jié)點的屬性值。
- 輸入:XmlDocument對象,XPath表達(dá)式,屬性名稱,要設(shè)置的值。
- 輸出:無。
- 設(shè)計思路:使用XmlDocument的
SelectSingleNode
方法根據(jù)XPath表達(dá)式選取指定節(jié)點,然后根據(jù)屬性名稱設(shè)置屬性的值。
UpdateNodeValueInFile(string filePath, string xpath, string value): void
- 功能:根據(jù)文件路徑、XPath表達(dá)式和值更新XML文件中的節(jié)點值。
- 輸入:文件路徑,XPath表達(dá)式,要設(shè)置的值。
- 輸出:無。
- 設(shè)計思路:首先從文件路徑加載XML文檔,然后調(diào)用SetNodeValue函數(shù)設(shè)置指定節(jié)點的值,最后保存XML文檔到文件。
UpdateAttributeValueInFile(string filePath, string xpath, string attributeName, string value): void
- 功能:根據(jù)文件路徑、XPath表達(dá)式、屬性名稱和值更新XML文件中的屬性值。
- 輸入:文件路徑,XPath表達(dá)式,屬性名稱,要設(shè)置的值。
- 輸出:無。
- 設(shè)計思路:首先從文件路徑加載XML文檔,然后調(diào)用SetAttributeValue函數(shù)設(shè)置指定節(jié)點的屬性值,最后保存XML文檔到文件。
到此這篇關(guān)于基于C#編寫一個操作XML的簡單類庫XMLHelper的文章就介紹到這了,更多相關(guān)C#操作XML內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實現(xiàn)IDisposable接口釋放非托管資源
這篇文章主要為大家介紹了C#實現(xiàn)IDisposable接口釋放非托管資源,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05C#實現(xiàn)計算一個點圍繞另一個點旋轉(zhuǎn)指定弧度后坐標(biāo)值的方法
這篇文章主要介紹了C#實現(xiàn)計算一個點圍繞另一個點旋轉(zhuǎn)指定弧度后坐標(biāo)值的方法,涉及C#針對坐標(biāo)的數(shù)學(xué)運算相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08C#抓取網(wǎng)絡(luò)圖片保存到本地的實現(xiàn)方法
下面小編就為大家分享一篇C#抓取網(wǎng)絡(luò)圖片保存到本地的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01C#實現(xiàn)變量交換、斐波那契數(shù)列、質(zhì)數(shù)、回文方法合集
這篇文章介紹了C#實現(xiàn)變量交換、斐波那契數(shù)列、質(zhì)數(shù)、回文的方法合集,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02