C#: Visual Studio XML-Dokumentation parsen

Wieder ein Interessantes Thema 😉

FĂŒr ein kleines Dokumentations-System, welches Klassen aus der XML-Dokumentation heraus dokumentieren soll (quasi Ă€hnlich wie Sandcastle), brauchte ich eine Möglichkeit eine VS-XML-Dokumentations-Datei zu parsen.
Am liebsten wĂ€re mir gewesen, wenn ich den kompletten Inhalt gleich in eine DataTable bekommen hĂ€tte, in welcher ich dann nur noch nach den Membern filtern mĂŒsste.
Wie das leben so ist, bekommt man nie das, was man am liebsten hat.
Also habe ich mir hierfĂŒr selbst eine Klasse geschrieben.

Mit der kann ich nun z.b. folgendes machen:

1
2
3
STools.xmldoc xmldoc = new STools.xmldoc(@"tADB.xml");
DataTable dt = xmldoc.XMLDoc2DataTable();
dataGridView1.DataSource = dt;

Und in dem DataGridView wird die DataTable mit dem Inhalt der Dokumentation angezeigt.
Zwar noch ausbaufĂ€hig – aber schon mal ein ziemlich guter Anfang 🙂

Nachfolgend ein Beispiel, wie sowas aussehen könnte – und der Code der Klasse.

2009-11-26_2214

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Xml;
 
namespace STools
{
    class xmldoc
    {
 
        /// <summary>
        /// Klassen-Weites XmlDocument, wird ĂŒber Ctor gefĂŒllt.
        /// </summary>
        private XmlDocument XMLDoc;
 
        /// <summary>
        /// Konstruktor der Klasse.
        /// </summary>
        /// <param name="XMLPfad">Der Pfad zur VS-XML-Dokumentation-Datei.</param>
        public xmldoc(string XMLPfad)
        {
            XMLDoc = new XmlDocument();
            XMLDoc.Load(XMLPfad);
        }
 
        /// <summary>
        /// Erstellt eine DataTable aus der im Ctor ĂŒbergebenen XML-Datei.
        /// </summary>
        /// <returns>Eine DataTable mit der Klassen-Dokumentation als Inhalt</returns>
        internal DataTable XMLDoc2DataTable()
        {
            DataTable dt_xmldoc = new DataTable("xml_doc");
            dt_xmldoc.Columns.Add("typ");
            dt_xmldoc.Columns.Add("member");
            dt_xmldoc.Columns.Add("name");
            dt_xmldoc.Columns.Add("text");
 
            foreach (XmlElement xmlElement in XMLDoc["doc"]["members"])
            {
                DataRow dr_xmldoc = dt_xmldoc.NewRow();
                dr_xmldoc["typ"] = "member";
                dr_xmldoc["member"] = xmlElement.Attributes["name"].Value.Trim();
                dr_xmldoc["name"] = xmlElement.Attributes["name"].Value.Trim();
                dr_xmldoc["text"] = CleanText(xmlElement.ChildNodes[0].InnerText);
                dt_xmldoc.Rows.Add(dr_xmldoc);
 
                for (int i = 1; i < xmlElement.ChildNodes.Count; i++)
                {
                    dr_xmldoc = dt_xmldoc.NewRow();
                    dr_xmldoc["typ"] = xmlElement.ChildNodes[i].Name.Trim();
                    dr_xmldoc["member"] = xmlElement.Attributes["name"].Value.Trim();
                    if (xmlElement.ChildNodes[i].Attributes["name"] != null)
                    {
                        dr_xmldoc["name"] = xmlElement.ChildNodes[i].Attributes["name"].Value.Trim();
                    }
                    dr_xmldoc["text"] = CleanText(xmlElement.ChildNodes[i].InnerText);
                    dt_xmldoc.Rows.Add(dr_xmldoc);
                }
            }
 
            return dt_xmldoc;
        }
 
 
        /// <summary>
        /// Entfernt Leerzeichen aus den Zeilen des Übergebenen Textes.
        /// </summary>
        /// <param name="text">Ein Text.</param>
        /// <returns>Ein ext ohne Leerzeichen.</returns>
        private string CleanText(string text)
        {
            string neutext = "";
            foreach (string zeile in text.Split(new Char[] { '\n' }))
            {
                neutext = neutext + zeile.Trim() + Environment.NewLine;
            }
            return neutext;
        }
    }
}

leave your comment

*

UnterstĂŒtze den Frickelblog!