查看: 1044|回复: 1
打印 上一主题 下一主题

[其他] C#读XML文件帮助类

[复制链接]

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-11-25 02:11:56 |只看该作者 |倒序浏览
代码出处:http://www.oschina.net/code/snippet_111708_20735
需要有XPATH基础知识

using System.Xml;

///
/// XML文件读取帮助类
///
public class XmlReaderHelper {

    #region 获取XmlDocument对象

    ///
    /// 根据XML文件内容获取XmlDocument对象
    ///
    ///
    ///
    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;
    }

    ///
    /// 根据XML文件路径获取XmlDocument对象
    ///
    ///
    ///
    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节点(或节点列表)

    ///
    /// 获取父节点下指定节点名称的第一个子节点
    ///
    ///
    ///
    ///
    public static XmlNode GetFirstChildNodeByName ( XmlNode parentXmlNode, string childNodeName ) {
        var childXmlNodes = GetChildNodesByName(parentXmlNode, childNodeName);
        if (childXmlNodes != null && childXmlNodes.Count > 0) {
            return childXmlNodes[0];
        }

        return null;
    }

    ///
    /// 获取父节点下指定节点名称的子节点列表
    ///
    /// 父节点
    /// 节点名称
    ///
    public static XmlNodeList GetChildNodesByName ( XmlNode parentXmlNode, string nodeName ) {
        if (parentXmlNode == null || string.IsNullOrEmpty(nodeName)) {
            return null;
        }

        return GetChildNodesByXPathExpr(parentXmlNode, string.Format(".//{0}", nodeName));
    }

    ///
    /// 获取父节点下满足xpathExpr表达式的XML子节点列表
    ///
    /// 父节点
    ///
    ///   
    public static XmlNodeList GetChildNodesByXPathExpr ( XmlNode parentXmlNode, string xpathExpr ) {
        if (parentXmlNode == null || string.IsNullOrEmpty(xpathExpr)) {
            return null;
        }

        return parentXmlNode.SelectNodes(xpathExpr);
    }

    ///
    /// 获取父节点下的第一个子节点
    ///
    ///
    ///
    public static XmlNode GetFirstChildNode ( XmlNode parentXmlNode ) {
        var childXmlNodes = GetChildNodes(parentXmlNode);
        if (childXmlNodes != null && childXmlNodes.Count > 0) {
            return childXmlNodes[0];
        }

        return null;
    }

    ///
    /// 获取父节点的子节点列表
    ///
    /// 父节点
    ///
    public static XmlNodeList GetChildNodes ( XmlNode parentXmlNode ) {
        return parentXmlNode == null ? null : parentXmlNode.ChildNodes;
    }

    #endregion

    #region 读取节点属性值

    ///
    /// 读取某个XML节点的属性值(根据属性名)
    ///
    ///
    ///
    ///
    public static string ReadAttrValue ( XmlNode xmlNode, string attrName ) {
        var xmlElement = xmlNode as XmlElement;

        return xmlElement == null ? null : xmlElement.GetAttribute(attrName);
    }

    ///
    /// 读取父节点下指定节点名和属性名的第一个子节点的属性值
    ///
    /// XML父节点
    /// 节点名称
    /// 属性名
    ///
    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];
    }

    ///
    /// 读取父节点下指定节点名和属性名的所有子节点的该属性值的数组
    ///
    /// XML文档
    /// 节点名称
    /// 属性名
    ///
    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 读取父节点下的子节点的文本内容

    ///
    /// 读取父节点下指定节点名的第一个子节点的文本
    ///
    ///
    ///
    ///
    public static string ReadFirstChildNodeTextByName ( XmlNode parentXmlNode, string childNodeName ) {
        var childNodeTexts = ReadChildNodeTextsByName(parentXmlNode, childNodeName);
        if (childNodeTexts != null && childNodeTexts.Length > 0) {
            return childNodeTexts[0];
        }

        return null;
    }

    ///
    /// 读取父节点下指定节点名的所有子节点的文本数组
    ///
    ///
    ///
    ///
    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;
    }

    ///
    /// 读取父节点下的第一个子节点的文本
    ///
    ///
    ///
    public static string ReadFirstChildNodeText ( XmlNode parentXmlNode ) {
        var childNodeTexts = ReadChildNodeTexts(parentXmlNode);
        if (childNodeTexts != null && childNodeTexts.Length > 0) {
            return childNodeTexts[0];
        }

        return null;
    }

    ///
    /// 读取父节点下的所有子节点的文本数组
    ///
    ///
    ///
    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;
    }

    ///
    /// 读取XML节点文本
    ///
    ///
    ///
    public static string ReadNodeText ( XmlNode xmlNode ) {
        if (xmlNode == null) {
            return null;
        }

        return xmlNode.InnerText;
    }

    #endregion

}

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-11-25 04:52:12 |只看该作者
Very interesting artovle !!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-19 16:41 , Processed in 0.094346 second(s), 27 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部