Entwickler-Ecke

IO, XML und Registry - *.csproj aswählen, aber alle dazugehörigen *.cs anzeigen!?


Luna1987 - Di 10.03.09 08:43
Titel: *.csproj aswählen, aber alle dazugehörigen *.cs anzeigen!?
Hy @ all.
Habe wiedermal ein Problem, für welches ich nach ewigen googeln immer noch keine Lösung gefunden habe :-(

Ich kann zwischen verschiedenen RadioButtons auswählen, ob ich ein Verzeichnis, eine Datei (*.cs) oder eine Projektdatei (*.csproj) auswählen möchte.
Bei dem Verzeichnis werden mir alle darin befindlichen *.cs Datein in einer ListBox ausgegeben.
Bei der Dateiauswahl wird mir die Datei bzw. die Dateien (*.cs) in der ListBox angezeigt.
Bei der Projektauswahl zeitg er momentan nur die *.csproj Datei an. Ich möchte aber die dazugehörigen *.cs Dateien in der ListBox angezeigt bekommen.
Wie kann ich das realisieren, geht das überhaupt?

Hoffe mir kann jemand helfen.
Danke.


Moderiert von user profile iconChristian S.: Topic aus Basistechnologien verschoben am Di 10.03.2009 um 08:40


JüTho - Di 10.03.09 10:24

Hallo,

die csproj-Datei ist eine (fast) stinknormale xml-Datei. Sie kann also mit den Möglichkeiten der XmlDocument-Klasse (vielleicht auch XmlDataDocument, aber das bezweifle ich) gelesen und bearbeitet werden. Über "compile include" findest Du alle beteiligten Dateien, z.B.:

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  <ItemGroup>
    //  hier ist ein Formular
    <Compile Include="AnalyzingForm.cs">
      <SubType>Form</SubType>
    </Compile>
    <Compile Include="AnalyzingForm.Designer.cs">
      <DependentUpon>AnalyzingForm.cs</DependentUpon>
    </Compile>
    //  hier ist ein typisiertes DataSet
    <Compile Include="ConverterDataSet.cs">
      <SubType>Component</SubType>
    </Compile>
    <Compile Include="ConverterDataSet.Designer.cs">
      <DependentUpon>ConverterDataSet.cs</DependentUpon>
    </Compile>

Gruß Jürgen


Luna1987 - Di 10.03.09 12:38

Hallo Jürgen.
Erstmal danke für deine Antwort. Aber komme dennoch nicht so recht weiter. Ich öffne also die *.csproj Datei mit

C#-Quelltext
1:
2:
XmlDocument doc = new XmlDocument();
doc.Load("test.csproj");

Und dann?
Habe das mit dem "compile-include" nicht so recht verstanden?
Danke.


JüTho - Di 10.03.09 15:04

Hallo,

Du musst alle Knoten einer <ItemGroup> (anscheinend jeder <ItemGroup>) durchgehen: Wenn es sich um einen Knoten vom Typ "Compile" und dem Attribut "Include" handelt, gehört der Text des Attributs als Dateiname zur Liste. Das geht etwa so:

C#-Quelltext
1:
2:
3:
XmlNode xroot = xdoc.DocumentElement;
foreach(XmlNode node in xroot.ChildNodes[1].ChildNodes) {
  if (node.LocalName == "Compile" && node.Attributes.Contains("Include")) { ...

Hier fehlt auf jeden Fall noch die Prüfung, dass ich mich innerhalb des richtigen ItemGroup-Knoten befinde; ob LocalName die richtige Abfrage ist, weiß ich auch nicht, ebensowenig die Attribute-Prüfung. (Ich habe gerade mal eine xml-Datei analysiert.) Aber zumindest zusammen mit der SDK-Doku/MSDN solltest Du damit weiterkommen.

Gruß Jürgen


Luna1987 - Fr 13.03.09 12:11

Hy Jürgen.
Okay, danke für deine Hilfe, kann nun weiter genauer suchen, da ich einige Hinweise erhalten habe von dir.
Danke :-)


Luna1987 - Di 17.03.09 08:44

So, das Problem ist gelöst :lol:
Für alle die es interessiert bzw. dasselbe Problem haben/hatten, hier ein Teil des Codes. (Um den Code besser zur verstehen, sollte man einfach eine csproj Datei als XML Dokument öffnen, dann kann man das mit den Elemente besser nachvollziehen)


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
// öffne die die .csproj Datei als XML Datei
XmlDocument csproj = new XmlDocument();
csproj.Load("Pfad für die csproj Datei");

XmlNodeList itemGroups = csproj.GetElementsByTagName("ItemGroup");
foreach (XmlNode itemGroup in itemGroups)
{
       XmlNode compile = itemGroup["Compile"];
  while (true)
  {
    if (compile == null)
    {
      break;
    }
  _selectedFilesListBox.Items.Add(compile.Attributes["Include"].InnerText);
  compile = compile.NextSibling;
  }
}


Danke an alle, die mir geholfen haben :-)


JüTho - Di 17.03.09 10:26

Freut mich, Anne :lol: Das ist ja noch einfacher, als ich erwartet hatte. Jürgen