基于C#實(shí)現(xiàn)XML文件讀取工具類
本文實(shí)例講述了基于C#實(shí)現(xiàn)XML文件讀取工具類。分享給大家供大家參考。具體如下:
這是我去年寫的一個(gè)XML文件讀取工具類,現(xiàn)在做了一些調(diào)整
基本能滿足一般的XML文件讀取需求。
更新:
2013年6月26日19:37 Fix了幾個(gè)Bug,為所有方法添加單元測(cè)試,并運(yùn)行通過(guò);同時(shí)調(diào)整了幾個(gè)方法的位置。
/// <summary> /// Author: jiangxiaoqiang /// </summary> public class XmlReader { //========================================================= // #region 獲取XmlDocument對(duì)象 /// <summary> /// 根據(jù)XML文件內(nèi)容獲取XmlDocument對(duì)象 /// </summary> /// <param name="xmlFileContent"></param> /// <returns></returns> public static XmlDocument GetXmlDocByXmlContent(string xmlFileContent) { if (string.IsNullOrEmpty(xmlFileContent)) { return null; } var xDoc = new XmlDocument(); try { xDoc.LoadXml(xmlFileContent); } catch { xDoc = null; } return xDoc; } /// <summary> /// 根據(jù)XML文件路徑獲取XmlDocument對(duì)象 /// </summary> /// <param name="xmlFilePath"></param> /// <returns></returns> public static XmlDocument GetXmlDocByFilePath(string xmlFilePath) { if (string.IsNullOrEmpty(xmlFilePath) || !File.Exists(xmlFilePath)) { return null; } var xDoc = new XmlDocument(); try { xDoc.Load(xmlFilePath); } catch { throw new Exception(string.Format("請(qǐng)確認(rèn)該XML文件格式正確,路徑為:{0}", xmlFilePath)); } return xDoc; } #endregion //========================================================= // //========================================================= // #region 獲取XML節(jié)點(diǎn)(或節(jié)點(diǎn)列表) /// <summary> /// 獲取父節(jié)點(diǎn)下指定節(jié)點(diǎn)名稱的第一個(gè)子節(jié)點(diǎn) /// </summary> /// <param name="parentXmlNode"></param> /// <param name="childNodeName"></param> /// <returns></returns> public static XmlNode GetFirstChildNodeByName(XmlNode parentXmlNode, string childNodeName) { var childXmlNodes = GetChildNodesByName(parentXmlNode, childNodeName); if (childXmlNodes != null && childXmlNodes.Count > 0) { return childXmlNodes[0]; } return null; } /// <summary> /// 獲取父節(jié)點(diǎn)下指定節(jié)點(diǎn)名稱的子節(jié)點(diǎn)列表 /// </summary> /// <param name="parentXmlNode">父節(jié)點(diǎn)</param> /// <param name="nodeName">節(jié)點(diǎn)名稱</param> /// <returns></returns> public static XmlNodeList GetChildNodesByName(XmlNode parentXmlNode, string nodeName) { if (parentXmlNode == null || string.IsNullOrEmpty(nodeName)) { return null; } return GetChildNodesByXPathExpr(parentXmlNode, string.Format(".//{0}", nodeName)); } /// <summary> /// 獲取父節(jié)點(diǎn)下滿足xpathExpr表達(dá)式的XML子節(jié)點(diǎn)列表 /// </summary> /// <param name="parentXmlNode">父節(jié)點(diǎn)</param> /// <param name="xpathExpr"></param> /// <returns></returns> public static XmlNodeList GetChildNodesByXPathExpr(XmlNode parentXmlNode, string xpathExpr) { if (parentXmlNode == null || string.IsNullOrEmpty(xpathExpr)) { return null; } return parentXmlNode.SelectNodes(xpathExpr); } /// <summary> /// 獲取父節(jié)點(diǎn)下的第一個(gè)子節(jié)點(diǎn) /// </summary> /// <param name="parentXmlNode"></param> /// <returns></returns> public static XmlNode GetFirstChildNode(XmlNode parentXmlNode) { var childXmlNodes = GetChildNodes(parentXmlNode); if (childXmlNodes != null && childXmlNodes.Count > 0) { return childXmlNodes[0]; } return null; } /// <summary> /// 獲取父節(jié)點(diǎn)的子節(jié)點(diǎn)列表 /// </summary> /// <param name="parentXmlNode">父節(jié)點(diǎn)</param> /// <returns></returns> public static XmlNodeList GetChildNodes(XmlNode parentXmlNode) { return parentXmlNode == null ? null : parentXmlNode.ChildNodes; } #endregion //========================================================= // //========================================================= // #region 讀取節(jié)點(diǎn)屬性值 /// <summary> /// 讀取某個(gè)XML節(jié)點(diǎn)的屬性值(根據(jù)屬性名) /// </summary> /// <param name="xmlNode"></param> /// <param name="attrName"></param> /// <returns></returns> public static string ReadAttrValue(XmlNode xmlNode, string attrName) { var xmlElement = xmlNode as XmlElement; return xmlElement == null ? null : xmlElement.GetAttribute(attrName); } /// <summary> /// 讀取父節(jié)點(diǎn)下指定節(jié)點(diǎn)名和屬性名的第一個(gè)子節(jié)點(diǎn)的屬性值 /// </summary> /// <param name="parentXmlNode">XML父節(jié)點(diǎn)</param> /// <param name="childNodeName">節(jié)點(diǎn)名稱</param> /// <param name="attrName">屬性名</param> /// <returns></returns> public static string ReadFirstAttrValue(XmlNode parentXmlNode, string childNodeName, string attrName) { var attrVals = ReadAttrValues(parentXmlNode, childNodeName, attrName); return (attrVals == null || attrVals.Length == 0) ? null : attrVals[0]; } /// <summary> /// 讀取父節(jié)點(diǎn)下指定節(jié)點(diǎn)名和屬性名的所有子節(jié)點(diǎn)的該屬性值的數(shù)組 /// </summary> /// <param name="parentXmlNode">XML文檔</param> /// <param name="childNodeName">節(jié)點(diǎn)名稱</param> /// <param name="attrName">屬性名</param> /// <returns></returns> public static string[] ReadAttrValues(XmlNode parentXmlNode, string childNodeName, string attrName) { if (parentXmlNode == null || string.IsNullOrEmpty(childNodeName) || string.IsNullOrEmpty(attrName)) { return null; } var xpathExpr = string.Format("http://{0}[@{1}]", childNodeName, attrName); var nodes = GetChildNodesByXPathExpr(parentXmlNode, xpathExpr); if (nodes != null && nodes.Count > 0) { var nodeCount = nodes.Count; var attrVals = new string[nodeCount]; for (var i = 0; i < nodeCount; i++) { attrVals[i] = ((XmlElement)nodes[i]).GetAttribute(attrName); } return attrVals; } return null; } #endregion //========================================================= // //========================================================= // #region 讀取父節(jié)點(diǎn)下的子節(jié)點(diǎn)的文本內(nèi)容 /// <summary> /// 讀取父節(jié)點(diǎn)下指定節(jié)點(diǎn)名的第一個(gè)子節(jié)點(diǎn)的文本 /// </summary> /// <param name="parentXmlNode"></param> /// <param name="childNodeName"></param> /// <returns></returns> public static string ReadFirstChildNodeTextByName(XmlNode parentXmlNode, string childNodeName) { var childNodeTexts = ReadChildNodeTextsByName(parentXmlNode, childNodeName); if (childNodeTexts != null && childNodeTexts.Length > 0) { return childNodeTexts[0]; } return null; } /// <summary> /// 讀取父節(jié)點(diǎn)下指定節(jié)點(diǎn)名的所有子節(jié)點(diǎn)的文本數(shù)組 /// </summary> /// <param name="parentXmlNode"></param> /// <param name="childNodeName"></param> /// <returns></returns> public static string[] ReadChildNodeTextsByName(XmlNode parentXmlNode, string childNodeName) { if (parentXmlNode == null || string.IsNullOrEmpty(childNodeName)) { return null; } var xpathExpr = string.Format(".//{0}", childNodeName); var childNodes = GetChildNodesByXPathExpr(parentXmlNode, xpathExpr); if (childNodes != null && childNodes.Count > 0) { var nodeCount = childNodes.Count; var nodeTexts = new string[nodeCount]; for (var i = 0; i < nodeCount; i++) { nodeTexts[i] = childNodes[i].InnerText; } return nodeTexts; } return null; } /// <summary> /// 讀取父節(jié)點(diǎn)下的第一個(gè)子節(jié)點(diǎn)的文本 /// </summary> /// <param name="parentXmlNode"></param> /// <returns></returns> public static string ReadFirstChildNodeText(XmlNode parentXmlNode) { var childNodeTexts = ReadChildNodeTexts(parentXmlNode); if (childNodeTexts != null && childNodeTexts.Length > 0) { return childNodeTexts[0]; } return null; } /// <summary> /// 讀取父節(jié)點(diǎn)下的所有子節(jié)點(diǎn)的文本數(shù)組 /// </summary> /// <param name="parentXmlNode"></param> /// <returns></returns> public static string[] ReadChildNodeTexts(XmlNode parentXmlNode) { if (parentXmlNode == null) { return null; } var childNodes = GetChildNodes(parentXmlNode); if (childNodes != null && childNodes.Count > 0) { var nodeCount = childNodes.Count; var nodeTexts = new string[nodeCount]; for (var i = 0; i < nodeCount; i++) { nodeTexts[i] = childNodes[i].InnerText; } return nodeTexts; } return null; } /// <summary> /// 讀取XML節(jié)點(diǎn)文本 /// </summary> /// <param name="xmlNode"></param> /// <returns></returns> public static string ReadNodeText(XmlNode xmlNode) { if (xmlNode == null) { return null; } return xmlNode.InnerText; } #endregion //========================================================= // }
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#設(shè)計(jì)模式之適配器模式與裝飾器模式的實(shí)現(xiàn)
創(chuàng)建型設(shè)計(jì)模式主要是為了解決創(chuàng)建對(duì)象的問題,而結(jié)構(gòu)型設(shè)計(jì)模式則是為了解決已有對(duì)象的使用問題。本文將用C#語(yǔ)言實(shí)現(xiàn)結(jié)構(gòu)型設(shè)計(jì)模式中的適配器模式與裝飾器模式,感興趣的可以了解一下2022-04-04Unity 使用TexturePacker打包圖集的操作方法
這篇文章主要介紹了Unity 使用TexturePacker打包圖集的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08在Framework 4.0中:找出新增的方法與新增的類(一)
經(jīng)??吹接型瑢W(xué)在討論Framework 4 的新特性,新方法,于是想寫個(gè)程序找出framework4.0中新增的方法和類2013-05-05C# 讀取ttf字體文件里的Unicode實(shí)現(xiàn)
這篇文章主要介紹了C# 讀取 ttf字體文件里的 Unicode實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09