Linq处理XML文档

    /// <summary>
    /// 处理Xml文档的封装
    /// </summary>
    public static class XmlHelper
    {
        /// <summary>
        /// 获得XDocument实体
        /// </summary>
        /// <param name="fileName">文件名</param>
        /// <returns>XDocument实体</returns>
        public static XDocument GetXml(string fileName)
        {
            if (fileName.IndexOf("//") == -1)
            {
                fileName = StringHelper.GetRootServerPath() + Constants.CONFIG_FILEPATH + "//" + fileName;
            }
            return XDocument.Load(fileName);
        }
        /// <summary>
        /// 获得子节点实体
        /// </summary>
        /// <param name="element">节点</param>
        /// <param name="nodeName">子节点的定义</param>
        /// <param name="name">子节点的属性名称</param>
        /// <param name="value">子节点的属性值</param>
        /// <returns>子节点属性值为指定值的,若null没找到,否则返回第一个匹配的</returns>
        public static XElement GetElement(XElement element, XName nodeName, XName name, string value)
        {
            if (element == null || element.Element(nodeName) == null)
            {
                return null;
            }
            else
            {
                var query =
                    from
                        i in element.Elements(nodeName)
                    where
                        i.Attribute(name) != null && i.Attribute(name).Value.Equals(value, StringComparison.CurrentCultureIgnoreCase)
                    select i;
                if (query == null || query.Count() < 1)
                {
                    return null;
                }
                else
                {
                    foreach (XElement result in query)
                    {
                        return result;
                    }
                    return null;
                }
            }
        }
        /// <summary>
        /// 获得节点name数组指定的最后一个节点
        /// </summary>
        /// <param name="element">节点</param>
        /// <param name="names">节点name数组</param>
        /// <returns>name数组指定的最后一个节点,若null没找到,否则返回第一个匹配的</returns>
        public static XElement GetElement(XElement element, XName[] names)
        {
            if (element == null || names == null || names.Length < 1)
            {
                return null;
            }
            else
            {
                XName name = names[0];
                if (name == null || element.Element(name) == null)
                {
                    return null;
                }
                else
                {
                    element = element.Element(name);
                    for (int i = 1; i < names.Length; i++)
                    {
                        name = names[i];
                        if (element == null || name == null)
                        {
                            return null;
                        }
                        else
                        {
                            element = element.Element(name);
                        }
                    }
                }
                return element;
            }
        }
        /// <summary>
        /// 获得element下node指定的子节点实体
        /// </summary>
        /// <param name="element">节点</param>
        /// <param name="node">element下子节点名称</param>
        /// <returns>element下node指定的子节点实体,若null没找到,否则返回第一个匹配的</returns>
        public static XElement GetElement(XElement element, XName node)
        {
            return GetElement(element, new XName[] { node });
        }
        /// <summary>
        /// 获得root下node指定的节点实体
        /// </summary>
        /// <param name="doc">XDocument实体</param>
        /// <param name="node">root下节点名称</param>
        /// <returns>root下node指定的节点实体,若null没找到,否则返回第一个匹配的</returns>
        public static XElement GetElement(XDocument doc, XName node)
        {
            return GetElement(doc.Root, new XName[] { node });
        }
        /// <summary>
        /// 获得节点name数组指定的最后一个节点的集合
        /// </summary>
        /// <param name="element">节点</param>
        /// <param name="names">节点name数组</param>
        /// <returns>name数组指定的最后一个节点的集合,若null没找到,否则返回集合</returns>
        public static IEnumerable<XElement> GetElements(XElement element, XName[] names)
        {
            if (element == null || names == null || names.Length < 1)
            {
                return null;
            }
            else
            {
                XName name = names[0];
                if (name == null || element.Element(name) == null)
                {
                    return null;
                }
                else if (names.Length == 1)
                {
                    return element.Elements(name);
                }
                else
                {
                    element = element.Element(name);
                    for (int i = 1; i < names.Length; i++)
                    {
                        name = names[i];
                        if (element == null || name == null || element.Element(name) == null)
                        {
                            return null;
                        }
                        else if (i == names.Length - 1)
                        {
                            return element.Elements(name);
                        }
                        else
                        {
                            element = element.Element(name);
                        }
                    }
                }
                return null;
            }
        }
        /// <summary>
        /// 获得节点name数组指定的最后一个节点的集合
        /// </summary>
        /// <param name="element">节点</param>
        /// <param name="names">节点name数组</param>
        /// <param name="nodeName">子节点的定义</param>
        /// <param name="name">子节点的属性名称</param>
        /// <param name="value">子节点的属性值</param>
        /// <returns>name数组指定的最后一个节点的集合的nodeName子节点属性值为指定值的,若null没找到,否则返回集合</returns>
        public static IEnumerable<XElement> GetElements(XElement element, XName[] names,XName nodeName,XName name,string value)
        {
            if (names != null)
            {
                element = GetElement(element, names);
            }
            if (element == null || element.Element(nodeName) == null)
            {
                return null;
            }
            else
            {
                return
                    from
                        i in element.Elements(nodeName)
                    where
                        i.Attribute(name) != null && i.Attribute(name).Value.Equals(value, StringComparison.CurrentCultureIgnoreCase)
                    select i;
            }
        }
        /// <summary>
        /// 获得指定属性值
        /// </summary>
        /// <param name="element">节点实体</param>
        /// <param name="name">属性名</param>
        /// <returns>属性值(原始值),若""则未设置此属性</returns>
        public static string GetAttributeOriginal(XElement element, XName name)
        {
            if (element == null || name == null)
            {
                return "";
            }
            else
            {
                XAttribute result = element.Attribute(name);
                if (result == null)
                {
                    return "";
                }
                else
                {
                    return result.Value;
                }
            }
        }
        /// <summary>
        /// 获得指定属性值(已转化为小写)
        /// </summary>
        /// <param name="element">节点实体</param>
        /// <param name="name">属性名</param>
        /// <returns>属性值(已转化为小写),若""则未设置此属性</returns>
        public static string GetAttribute(XElement element, XName name)
        {
            return GetAttributeOriginal(element, name).Trim().ToLower();
        }
        /// <summary>
        /// 获得指定属性值 若""则返回默认值def (已转化为小写)
        /// </summary>
        /// <param name="element">节点实体</param>
        /// <param name="name">属性名</param>
        /// <returns>属性值(已转化为小写),若""则返回默认值def</returns>
        public static string GetAttribute(XElement element, XName name, string def)
        {
            string result = GetAttribute(element, name);
            if (result == "")
            {
                return def;
            }
            else
            {
                return result;
            }
        }
        /// <summary>
        /// 获得属性的数值
        /// </summary>
        /// <param name="element">节点</param>
        /// <param name="name">属性</param>
        /// <param name="def">默认值</param>
        /// <returns></returns>
        public static int GetIntValue(XElement element, string name, int def)
        {
            int result = def;
            string resultStr = XmlHelper.GetAttribute(element, name);
            if (resultStr == "")
            {
                return def;
            }
            else
            {
                return DataHelper.GetIntValue(resultStr, def);
            }
        }
        /// <summary>
        /// 获得节点的值
        /// </summary>
        /// <param name="element">节点实体</param>
        /// <returns>值,若""则无值</returns>
        public static string GetValue(XElement element)
        {
            if (element == null || element.HasElements)
            {
                return "";
            }
            else
            {
                string result = element.Value;
                if (result == null)
                {
                    return "";
                }
                else
                {
                    return result.Trim().Replace("/n", "").Replace("/r", "");
                }
            }
        }
        /// <summary>
        /// 给指定的属性赋值
        /// </summary>
        /// <param name="element">节点实体 空不能赋值</param>
        /// <param name="name">属性值 属性值为空不能赋值</param>
        /// <param name="value">值对象 空或ToString()==""则不赋值 去除特殊字符</param>
        public static void SetAttribute(XElement element, XName name, object value)
        {
            if (element != null && name != null && value != null && !Convert.IsDBNull(value))
            {
                string v = "";
                if (value is DateTime)
                {
                    v = Convert.ToDateTime(value).ToString(Constants.DATE_FORMART_TOEXCEL);
                }
                else
                {
                    v = GetAttributeValue(value.ToString().Trim());
                }
                if (v != "")
                {
                    element.SetAttributeValue(name, v);
                }
            }
        }
        /// <summary>
        /// 给指定的属性赋值
        /// </summary>
        /// <param name="element">节点</param>
        /// <param name="names">节点name数组 给最后一个节点的属性赋值 为空不能赋值</param>
        /// <param name="attName">属性值 属性值为空不能赋值</param>
        /// <param name="value">值对象 空或ToString()==""则不赋值 去除特殊字符</param>
        public static void SetAttribute(XElement element, XName[] names, XName attName, string value)
        {
            SetAttribute(GetElement(element, names), attName, value);
        }
        /// <summary>
        /// 给指定的属性赋值
        /// </summary>
        /// <param name="element">节点</param>
        /// <param name="names">节点name数组 给最后一个节点的属性赋值 为空不能赋值</param>
        /// <param name="nvs">属性及值集合</param>
        public static void SetAttribute(XElement element, XName[] names, NameValueCollection nvs)
        {
            element = GetElement(element, names);
            if (element != null && nvs != null)
            {
                for (int i = 0; i < nvs.Count; i++)
                {
                    XName name;
                    if (element.Name.Namespace != null)
                    {
                        name = element.Name.Namespace + nvs.GetKey(i);
                    }
                    else
                    {
                        name = nvs.GetKey(i);
                    }
                    SetAttribute(element, name, nvs[i]);
                }
            }
        }
        /// <summary>
        /// 去除属性值中不符合xml要求的字符
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        private static string GetAttributeValue(string value)
        {
            if (value == "")
            {
                return "";
            }
            else
            {
                return value.Replace("&", "").Replace("<", "").Replace(">", "").Replace("/"", "").Replace("%", "");
            }
        }
        /// <summary>
        /// 给指定的节点赋值(如果节点不存在则创建)
        /// </summary>
        /// <param name="element">节点</param>
        /// <param name="nvs">节点及值集合</param>
        public static void SetValue(XElement element, NameValueCollection nvs)
        {
            if (element != null && nvs != null)
            {
                for (int i = 0; i < nvs.Count; i++)
                {
                    XName name;
                    if (element.Name.Namespace != null)
                    {
                        name = element.Name.Namespace + nvs.GetKey(i);
                    }
                    else
                    {
                        name = nvs.GetKey(i);
                    }
                    string value = nvs[i];
                    if (!String.IsNullOrEmpty(value))
                    {
                        XElement sub = element.Element(name);
                        if (sub != null)
                        {
                            sub.SetValue(value);
                        }
                        else
                        {
                            sub = new XElement(name);
                            sub.SetValue(value);
                            element.Add(sub);
                        }
                    }
                }
            }
        }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
难得的学习LINQ的中文资料,很全很详细,包内包括两个文档: 一个是语言集成查询.pdf,内容简介如下: 1.LINQ 简介 简要介绍可编写的各种应用程序,以及使用 LINQ 查询可以解决的各种问题。 2.C# 中的 LINQ 入门 描述为理解 C# 文档和示例所应了解的基本情况。 3.Visual Basic 中的 LINQ 入门 描述为理解 Visual Basic 文档和示例所应了解的基本情况。 4.如何:创建 LINQ 项目 介绍生成 LINQ 项目所需的 .NET Framework 版本、引用和命名空间。 5.对 LINQ 的 Visual Studio IDE 和工具支持 描述对象关系设计器、对查询的调试器支持以及其他与 LINQ 相关的 IDE 功能。 6.LINQ 常规编程指南 提供了指向相关主题的链接,这些主题包含有关如何使用 LINQ 进行编程的信息,例如标准查询运算符、表 达式目录树和查询提供程序。 7.LINQ to Objects 包含指向相关主题的链接,这些主题说明如何使用 LINQ to Objects 来访问内存中的数据结构。 8.LINQ to XML 包含指向说明如何使用 LINQ to XML 的主题的链接,此功能可提供文档对象模型 (DOM) 的内存中文档修改 功能,并且支持 LINQ 查询表达式。 9.LINQ to ADO.NET(门户页) 提供 linq_dataset 和 vbtecdlinq 相关文档的入口点。 LINQ to DataSet 使您可以通过使用为其他数据源提供的相同查询功能,在 DataSet 中加入更丰富的查询功能。 LINQ to SQL 为将关系数据作为对象进行管理提供了运行时基础结构。 10.补充的 LINQ 资源 指向 LINQ 相关信息的其他联 另一个是LINQ to ADO.net.pdf 描述linq如何与ado.net结合使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值