C# 读取XML注释

C#可以通过反射读取类的字段/方法等,可是该如何获取该字段的XML注释?

具体目的:有一个实体类,页面需要有一个与其对应的table,样式大体为

      <tr>
                <td>地东经</td>
                <td>
                    <input id=‘txt_Longitude‘ type=‘text‘ class=‘form-control‘ name=‘Longitude‘ /></td>
                <td>北纬</td>
                <td>
                    <input id=‘Latitude‘ type=‘text‘ class=‘form-control‘ name=‘Latitude‘ /></td>
            </tr>

其实体类,大致为:

     /// <summary>
        /// 东经
        /// </summary>
        public double? Longitude
        {
            get{ return _Longitude; }
            set
            {
                this.OnPropertyValueChange(_.Longitude,_Longitude,value);           this._Longitude=value;        }      }

由于实体类中属性很多,生成页面的工作量很大,所以想通过反射的方式,读取实体的XML注释及其属性名称,写个循环即可生成上述页面

后查阅相关资料,XML注释是不写入DLL里的,所以直接通过反射的方式获取XML注释是不可能的.

有建议通过对XML文件进行解析,获取其XML注释的

万能的老外已经处理过类似的问题了,参考这里

其提供了一个处理用的类库以及示例

1.在VS里打开项目属性中的XML文档注释功能

即在项目的bin目录中生成一个以当前项目命名的xml文件,读取该文件,即可获取XML注释

2.按照如下方式,获取XML注释

XmlElement documentation = DocsByReflection.XMLFromMember(typeof(SomeExampleClass).GetProperty("ExampleProperty"));
Console.WriteLine(documentation["summary"].InnerText.Trim());

下载链接:

docsbyreflection_2

通过反射获取字段名称/字段类型/及其XML注释,即可根据需要生成页面HTML,示例如下:

StringBuilder sb = new StringBuilder();
            string rowtemp = "<tr>\r\n" +
                                "<td>{0}</td>\r\n " +
                                "<td>" +
                                    "<input id = ‘txt_{1}‘ type = ‘text‘ class=‘form-control‘ name=‘{1}‘ /></td>\r\n" +
                                "<td>{2}</td>\r\n" +
                                "<td>\r\n" +
                                    "<input id = ‘{3}‘ type=‘text‘ class=‘form-control‘ name=‘{3}‘ /></td>\r\n" +
                            "</tr>\r\n";

            //遍历基本属性,生成表
            PropertyInfo[] ProList = tp1.GetProperties();
            List<string> ignoreList = new List<string>();
            ignoreList.Add("Project_Code");
            bool toEnd = false;

            #region 区分字段类型
            for (int i = 0; i < ProList.Length; )
            {         //下述循环为了实现对字段的过滤,以及一行两个<td>,所以,需要检索出下一个可用的字段对象,看上去比较绕
                while (ignoreList.Contains(ProList[i].Name))
                {
                    i++;
                    if (i == ProList.Length)
                    {
                        toEnd = true;
                        break;
                    }
                }
                if (toEnd)
                {
                    break;
                }
                PropertyInfo p1 = ProList[i];
                i++;
                PropertyInfo p2 = null;
                if (i < ProList.Length)
                {
                    while (ignoreList.Contains(ProList[i].Name))
                    {
                        i++;
                        if (i == ProList.Length)
                        {
                            toEnd = true;
                            break;
                        }
                    }
                }

                if (toEnd || i == ProList.Length)
                {

                }
                else
                {
                    p2 = ProList[i];
                    i++;
                }
                sb.AppendLine("<tr>");
                if (p2 != null)
                {
                    string str1 = getHTML(tp1, p1);
                    string str2 = getHTML(tp1, p2);
                    sb.AppendLine(str1);
                    sb.AppendLine(str2);
                }
                else
                {
                    string str1 = getHTML(tp1, p1);
                    sb.AppendLine(str1);
                }
                sb.AppendLine("</tr>");
            }
            #endregion

            write2Text(@"C:\STD\"+tp1.Name+".txt", sb);
            Console.WriteLine("结束");
            Console.ReadLine();
public static string getCommentText(Type tp1,string nm)
        {
            Console.WriteLine(nm);
            XmlElement documentation = DocsByReflection.XMLFromMember(tp1.GetProperty(nm));
            Console.WriteLine(documentation["summary"].InnerText.Trim());
            return documentation["summary"].InnerText.Trim();
        }

        public static void write2Text(string filename, StringBuilder sb)
        {
            using (FileStream fs = new FileStream(filename, FileMode.OpenOrCreate))
            {
                using (StreamWriter sw = new StreamWriter(fs))
                {
                    sw.Write(sb.ToString());
                    sw.Flush();
                }
            }
        }

        public static string getHTML(Type tp1,PropertyInfo p)
        {
            if (p.Name.Trim() == "Conveyance_Tunnel_Import_Elevation")
                Console.WriteLine("");
            string inputTD = "<td>{0}</td>\r\n " +
                                "<td>\r\n" +
                                    "<input id = ‘txt_{1}‘ type = ‘text‘ class=‘form-control‘ name=‘{1}‘ />\r\n"+
                                    "</td>\r\n";

            string selectTD = @"<td>{0}</td>
                                <td>
                                <select id=‘{1}‘ class=‘form-control‘ name=‘{1}‘>
                                    {2}
                                </select>
                            </td>";

            string chkTD = @"<td>{0}</td>
                <td>
                    <label for=‘chkY_{1}‘>是<input type=‘checkbox‘ id=‘chkY_{1}‘ value=‘true‘ class=‘form-control‘ name=‘{1}‘></label>
                    <label for=‘chkN_{1}‘>否<input type=‘checkbox‘ value=‘false‘ id=‘chkN_{1}‘ class=‘form-control‘ name=‘{1}‘></label>
                </td>";

            if (p.PropertyType == typeof(Guid?)||p.PropertyType==typeof(Guid))
            {
                //GUID类型的,去数据库中查找并生成Select
                StringBuilder optSb = new StringBuilder();
                DataTable dt = SqlHelper.ExecuteDataTable("select * from Foreign_Key_Table where [email protected] and [email protected] order by Order_ID",
                    new SqlParameter("@cc", p.Name),new SqlParameter("tc",type_code));
                if (dt.Rows.Count > 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        optSb.AppendLine(string.Format("<option value=‘{0}‘>{1}</option>", dt.Rows[i]["Key_Code"], dt.Rows[i]["Key_Name"]));
                    }
                    return string.Format(selectTD, getCommentText(tp1, p.Name), p.Name, optSb.ToString());
                }
                else
                {
                    //如果没有查到,非外键表,直接显示
                    return string.Format(inputTD, getCommentText(tp1, p.Name), p.Name);
                }
            }
            else if (p.PropertyType == typeof(bool?) || p.PropertyType == typeof(bool))
            {
                return string.Format(chkTD,getCommentText(tp1, p.Name),p.Name);
            }
            else
            {
                //生成input
                return string.Format(inputTD,getCommentText(tp1,p.Name),p.Name);
            }
        }
时间: 2024-07-30 13:39:56

C# 读取XML注释的相关文章

C# 读取xml文件忽略xml文件的注释

默认情况下,读取xml文件是不忽略注释的,这样读取带注释的节点会造成异常,那么怎么屏蔽掉这些注释呢? 方案如下: XmlDocument doc = new XmlDocument(); XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreComments = true; //xmlFilePath:xml文件路径 XmlReader reader = XmlReader.Create(xmlFilePath,

Asp.Net 读取xml文件中Key的值,并且过滤掉注释内容代码

/// <summary> /// 读取配置文件keys /// </summary> /// <returns></returns> public string _GetKeys() { string filename = Server.MapPath("/") + @"web.config"; XmlDocument xmldoc = new XmlDocument(); XmlReaderSettings set

C#中常用的几种读取XML文件的方法

XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具.XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用.微软也提供了一系列类库来倒帮助我们在应用程序中存储XML文件. “在程序中访问

利用XPath读取Xml文件

之所以要引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素.可以把XPath比作文件管理路径:通过文件管理路 径,可以按照一定的规则查找到所需要的文件:同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点. 不过,由于XPath可应用于不止一个的标准,因此W3C将其独立出来作为XSLT的配套标准颁布,它是XSLT以及我们后面要讲到的XPointer的重要组成部分. 在介绍XPath的匹配规则之前,我们先来看一些有关XPath的基

【java开发系列】— JDOM创建、修改、删除、读取XML文件

有很多中操作XML文件的方法,这里介绍一下JDOM的使用方法和技巧. JDOM下载地址 创建XML文档 XML文件是一种典型的树形文件,每个文档元素都是一个document元素的子节点.而每个子元素都是一个Element对象,对象可以向下包含. 1 因此我们可以通过先创建元素再将元素添加到父元素中,最后将顶层元素添加到根元素中. 2 创建完文档元素后,就可以把元素添加到document对象中,然后写入文件. 主要使用的函数: Element.setAttribute 为元素添加信息 Elemen

.Net 读取xml

一.常规方法 1.知识介绍 //初始化一个xml对象 XmlDocument xml = new XmlDocument(); //加载xml文件 xml.Load("文件路径"); //读取指定的节点 XmlNode xmlNode = xml.SelectSingleNode("/节点名"); //判断节点下是否有子节点 xmlNode.HasChildNodes; //读取节点下的所有子节点 XmlNodeList xmlNodeList = xmlNode.

java JAXB + STAX(是一种针对XML的流式拉分析API)读取xml

<dependency> <groupId>stax</groupId> <artifactId>stax-api</artifactId> <version>1.0.1</version> </dependency> 使用XMLStreamReader和XMLEventReader读取XML文件 1 <?xml version="1.0" encoding="UTF-8&q

C++读取XML,tinyXml的使用

前言: 最近在开发的过程中,有个需求是对xml进行格式转化,从一种格式转化到另外一种格式.因此,就需要读取xml进行处理.原本打算写成工具在linux下运行,不过后来考虑到和系统结合,最后也就使用了前台js转了.反正都是读取xml,什么技术转不都是一样的么? 不过刚开始还是对要使用的技术做了一定的探究.c++要读取xml有很多种方式.比较又名的有: rapidXML(这个是网上介绍的,没用过) Xerces-C++ XML Parser: 通常来说,读取XML的方法都是将整个文本进行读取,然后构

asp.net读取xml方法

这个适合刚学asp.net的同学,大神直接略过好了,asp.net经常会有很多用到XML的地方,比如全国省市的联动,以及一些菜单读取等等都有xml的影子,直接贴代码,以便我以后用到的时候忘了,注释我写得很清楚了,不懂的可以留言. /// <summary> /// 读取城市列表 /// </summary> public void CityList() { StringBuilder sb = new StringBuilder(); XmlDocument xmldoc = ne