XML-Datei lesen (*.csproj)

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    XML-Datei lesen (*.csproj)

    Guten Morgen allerseits,

    ich scheitere gerade daran, eine csproj-Datei einzulesen.
    Diese ist im MSBuild/XML-Format:

    Spoiler anzeigen

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    3. <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
    4. <PropertyGroup>
    5. <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    6. <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    7. <ProjectGuid>{86E2A821-E789-42E4-8676-CC47936D0D77}</ProjectGuid>
    8. <OutputType>WinExe</OutputType>
    9. <RootNamespace>VS_READER</RootNamespace>
    10. <AssemblyName>VS Reader</AssemblyName>
    11. <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    12. <FileAlignment>512</FileAlignment>
    13. <Deterministic>true</Deterministic>
    14. <TargetFrameworkProfile />
    15. </PropertyGroup>
    16. <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    17. <PlatformTarget>AnyCPU</PlatformTarget>
    18. <DebugSymbols>true</DebugSymbols>
    19. <DebugType>full</DebugType>
    20. <Optimize>false</Optimize>
    21. <OutputPath>bin\Debug\</OutputPath>
    22. <DefineConstants>DEBUG;TRACE</DefineConstants>
    23. <ErrorReport>prompt</ErrorReport>
    24. <WarningLevel>4</WarningLevel>
    25. </PropertyGroup>
    26. <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    27. <PlatformTarget>AnyCPU</PlatformTarget>
    28. <DebugType>pdbonly</DebugType>
    29. <Optimize>true</Optimize>
    30. <OutputPath>bin\Release\</OutputPath>
    31. <DefineConstants>TRACE</DefineConstants>
    32. <ErrorReport>prompt</ErrorReport>
    33. <WarningLevel>4</WarningLevel>
    34. </PropertyGroup>
    35. <ItemGroup>
    36. <Reference Include="Microsoft.Build" />
    37. <Reference Include="System" />
    38. <Reference Include="System.Data" />
    39. <Reference Include="System.Drawing" />
    40. <Reference Include="System.Windows.Forms" />
    41. <Reference Include="System.Xml" />
    42. </ItemGroup>
    43. <ItemGroup>
    44. <Compile Include="Core\Solution.cs" />
    45. <Compile Include="Core\Utilities.cs" />
    46. <Compile Include="Ui\Controls\DialogPanel.cs">
    47. <SubType>Component</SubType>
    48. </Compile>
    49. <Compile Include="Ui\Controls\MasterLabel.cs">
    50. <SubType>Component</SubType>
    51. </Compile>
    52. <Compile Include="Ui\Controls\TreeViewEx.cs">
    53. <SubType>Component</SubType>
    54. </Compile>
    55. <Compile Include="Ui\Dialogs\frmMain.cs">
    56. <SubType>Form</SubType>
    57. </Compile>
    58. <Compile Include="Ui\Dialogs\frmMain.Designer.cs">
    59. <DependentUpon>frmMain.cs</DependentUpon>
    60. </Compile>
    61. <Compile Include="Program.cs" />
    62. <Compile Include="Properties\AssemblyInfo.cs" />
    63. <EmbeddedResource Include="Ui\Dialogs\frmMain.resx">
    64. <DependentUpon>frmMain.cs</DependentUpon>
    65. </EmbeddedResource>
    66. <EmbeddedResource Include="Properties\Resources.resx">
    67. <Generator>ResXFileCodeGenerator</Generator>
    68. <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    69. <SubType>Designer</SubType>
    70. </EmbeddedResource>
    71. <Compile Include="Properties\Resources.Designer.cs">
    72. <AutoGen>True</AutoGen>
    73. <DependentUpon>Resources.resx</DependentUpon>
    74. <DesignTime>True</DesignTime>
    75. </Compile>
    76. <None Include="Properties\Settings.settings">
    77. <Generator>SettingsSingleFileGenerator</Generator>
    78. <LastGenOutput>Settings.Designer.cs</LastGenOutput>
    79. </None>
    80. <Compile Include="Properties\Settings.Designer.cs">
    81. <AutoGen>True</AutoGen>
    82. <DependentUpon>Settings.settings</DependentUpon>
    83. <DesignTimeSharedInput>True</DesignTimeSharedInput>
    84. </Compile>
    85. </ItemGroup>
    86. <ItemGroup />
    87. <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    88. </Project>


    Ich wollte den Wert von ​RootNamespace abfragen, weiß aber leider nicht, wie.
    Folgendes habe ich bereits probiert:

    C#-Quellcode

    1. var x = xml.GetElementsByTagName( "PropertyGroup" );
    2. var y = x.Item( 0 );
    3. var z = y.SelectSingleNode( "RootNamespace" );


    Allerdings ist die Variable z immer null...

    Was mache ich falsch?

    Danke für Eure Hilfe! ^^
    @RodFromGermany
    Den Code habe ich bei mir in nem Button drin:

    C#-Quellcode

    1. using( var dialog = new OpenFileDialog())
    2. {
    3. dialog.Filter = "C# Project File|*.csproj";
    4. if( dialog.ShowDialog(this) == DialogResult.OK)
    5. {
    6. XmlDocument xml = new XmlDocument();
    7. xml.Load( dialog.FileName );
    8. var x = xml.GetElementsByTagName( "PropertyGroup" );
    9. var y = x.Item( 0 );
    10. var z = y.SelectSingleNode( "RootNamespace" );
    11. }
    12. }


    Mit nem Haltepunkt hab ich mir dann den Inhalt von der Variable z angeschaut...
    Hallo,
    du kommst an die Nodes nur mit einem XmlNamespaceManager. Besser ist auch, gleich einen XPath-Ausdruck zu verwenden.

    C#-Quellcode

    1. var doc = new XmlDocument();
    2. doc.Load( dialog.FileName );
    3. var nsmgr = new XmlNamespaceManager(doc.NameTable);
    4. nsmgr.AddNamespace("ns", "http://schemas.microsoft.com/developer/msbuild/2003");
    5. var node = doc.DocumentElement.SelectSingleNode("//ns:Project/ns:PropertyGroup[1]/ns:RootNamespace", nsmgr);

    TRiViUM schrieb:

    Wird der XmNamespaceManager benötigt, weil die XML-Dateistruktur etwas komplexer ist?

    Nein, du brauchst den NamespaceManager, weil in dem Xml ein Namespace definiert ist
    <Project ... xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    Ein XPath-Ausdruck ist das, was ich bei SelectSingleNode verwendet habe und ist gewissermaßen eine explizite Abfrage eines Knotens/Wertes im Xml Dokument.
    AddNamespace brauchst du, damit der XmlNamespaceManager den Namespace kennt. Das geht nicht einfach so ;)
    @TRiViUM Probier mal

    C#-Quellcode

    1. XmlDocument xml = new XmlDocument();
    2. xml.Load(dialog.FileName);
    3. XmlNodeList x = xml.GetElementsByTagName("PropertyGroup");
    4. XmlNode y = x.Item(0);
    5. XmlElement a1 = y["RootNamespace"];
    6. string a2 = a1.InnerText;
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Der Trick besteht darin zu erkennen, was das gesuchte Element tatsächlich ist bzw. nicht ist.
    Ein Node war es nicht, da blieb nur noch XmlElement übrig.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!