基于C#实现XML文件读取工具类

本文实例讲述了基于C#实现XML文件读取工具类。分享给大家供大家参考。具体如下:

这是我去年写的一个XML文件读取工具类,现在做了一些调整
基本能满足一般的XML文件读取需求。
更新:
2013年6月26日19:37 Fix了几个Bug,为所有方法添加单元测试,并运行通过;同时调整了几个方法的位置。

/// <summary>
/// Author: jiangxiaoqiang
/// </summary>
public class XmlReader
{
  //========================================================= //
  #region 获取XmlDocument对象
  /// <summary>
  /// 根据XML文件内容获取XmlDocument对象
  /// </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>
  /// 根据XML文件路径获取XmlDocument对象
  /// </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("请确认该XML文件格式正确,路径为:{0}", xmlFilePath));
    }
    return xDoc;
  }
  #endregion
  //========================================================= //
  //========================================================= //
  #region 获取XML节点(或节点列表)
  /// <summary>
  /// 获取父节点下指定节点名称的第一个子节点
  /// </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>
  /// 获取父节点下指定节点名称的子节点列表
  /// </summary>
  /// <param name="parentXmlNode">父节点</param>
  /// <param name="nodeName">节点名称</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>
  /// 获取父节点下满足xpathExpr表达式的XML子节点列表
  /// </summary>
  /// <param name="parentXmlNode">父节点</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>
  /// 获取父节点下的第一个子节点
  /// </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>
  /// 获取父节点的子节点列表
  /// </summary>
  /// <param name="parentXmlNode">父节点</param>
  /// <returns></returns>
  public static XmlNodeList GetChildNodes(XmlNode parentXmlNode)
  {
    return parentXmlNode == null ? null : parentXmlNode.ChildNodes;
  }
  #endregion
  //========================================================= //
  //========================================================= //
  #region 读取节点属性值
  /// <summary>
  /// 读取某个XML节点的属性值(根据属性名)
  /// </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>
  /// 读取父节点下指定节点名和属性名的第一个子节点的属性值
  /// </summary>
  /// <param name="parentXmlNode">XML父节点</param>
  /// <param name="childNodeName">节点名称</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>
  /// 读取父节点下指定节点名和属性名的所有子节点的该属性值的数组
  /// </summary>
  /// <param name="parentXmlNode">XML文档</param>
  /// <param name="childNodeName">节点名称</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("//{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 读取父节点下的子节点的文本内容
  /// <summary>
  /// 读取父节点下指定节点名的第一个子节点的文本
  /// </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>
  /// 读取父节点下指定节点名的所有子节点的文本数组
  /// </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>
  /// 读取父节点下的第一个子节点的文本
  /// </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>
  /// 读取父节点下的所有子节点的文本数组
  /// </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节点文本
  /// </summary>
  /// <param name="xmlNode"></param>
  /// <returns></returns>
  public static string ReadNodeText(XmlNode xmlNode)
  {
    if (xmlNode == null)
    {
      return null;
    }
    return xmlNode.InnerText;
  }
  #endregion
  //========================================================= //
}

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • 深入C#中使用SqlDbType.Xml类型参数的使用详解

    在sql server2005以及之后的sql server中引入了Xml数据类型,在C#中使用Xml数据类型需要指定参数类型为SqlDbType,参数值类型需要用SqlXml,如下示例:假定有一种表A,A表有两个字段:ID 类型 int,Data 类型 Xml,我要用C#往表中插入一行记录: 复制代码 代码如下: static void InsertA(int aid, string contentXml){//ConnString是连接字符串,需要额外定义    using (SqlConn

  • c#操作xml帮助类分享(xml增删改查)

    复制代码 代码如下: using System;using System.Collections;using System.Xml; namespace Jb51.Com.XmlDAL{public class XmlHelper{#region 公共变量XmlDocument xmldoc;XmlNode xmlnode;XmlElement xmlelem;#endregion #region 创建Xml文档/// <summary>/// 创建一个带有根节点的Xml文件/// </

  • C#实现的xml操作类完整实例

    本文实例讲述了C#实现的xml操作类,分享给大家供大家参考,具体如下: using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System

  • C#自定义处理xml数据类实例

    本文实例讲述了C#自定义处理xml数据类.分享给大家供大家参考.具体分析如下: 这个C#类专门用户处理xml数据,可以大大简化xml的操作,类中封装了常用的xml操作,包括打开.读取xml数据,读取.写入节点数据,通过xpath读取节点数据,导出节点数据等等,还可以根据需要自己扩充类的功能. using System; using System.Data; using System.IO; using System.Xml; namespace DotNet.Utilities { public

  • 详解C#借助.NET框架中的XmlTextReader类读取XML的方法

    XmlTextReader 提供对 XML 数据流的只进只读访问.当前节点指读取器定位到的节点.使用任何读方法推进读取器并且属性反映当前节点的值. 此类实现 XmlReader 并符合 W3C 可扩展标记语言 (XML) 1.0 和"XML 中的命名空间"建议.XmlTextReader 提供以下功能: 执行格式良好的 XML 的规则. XmlTextReader 不提供数据验证. 检查 DocumentType 节点是否是格式良好的.XmlTextReader 检查 DTD 的格式是

  • C#写入对象或集合类型数据到xml文件的方法

    本文实例讲述了C#写入对象或集合类型数据到xml文件的方法.分享给大家供大家参考.具体实现方法如下: public static string SerializeToXmlString(object objectToSerialize) { MemoryStream memoryStream = new MemoryStream(); System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serializati

  • C#中使用XmlDocument类来创建和修改XML格式的数据文件

    通过XmlDocument类修改XML文档数据,通常需要以下几个主要步骤或其中几个步骤. (1)获取一个包含XML文档数据的XmlDocument类对象,通常有两种方法来实现这个功能: 通过XmlDocument类的构造函数创建不包含任何结点的空对象,常用默认构造函数. (2)通过XmlDocument类的ChildNodes和Item属性获取某个结点(XmlNode类型),通过XmlNode的Name.Value.InnerText等属性修改选中结点的数据. (3)通过XmlDocument类

  • C# 操作XML文档 使用XmlDocument类方法

    W3C制定了XML DOM标准.很多编程语言中多提供了支持W3C XML DOM标准的API.我在之前的文章中介绍过如何使用Javascript对XML文档进行加载与查询.在本文中,我来介绍一下.Net中的XmlDocument类.它支持并扩展了W3C XML DOM标准.它将整个XML文档都先装载进内存中,然后再对XML文档进行操作,所以如果XML文档内容过大,不建议使用XmlDocument类,因为会消耗过多内存.对于很大的XML文档,可以使用XmlReader类来读取.因为XmlReade

  • C#实现的XML操作类实例

    本文实例讲述了C#实现的XML操作类.分享给大家供大家参考.具体如下: 这里讲述了C#写的一个XML操作类,包括读取/插入/修改/删除. using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.W

  • C#实现XML与实体类之间相互转换的方法(序列化与反序列化)

    本文实例讲述了C#实现XML与实体类之间相互转换的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; using System.Xml; using System.Xml.Serialization; /// <summary> /// Xml序列化与反序列化 //

随机推荐