如何使用 XML 从 C# 中的非 SDK 样式的 csproj 文件中读取程序集名称?
How to read the assembly name from a non SDK style csproj file in C# using XML?
我的代码是:
var doc = new XPathDocument(projectFilePath);
var nav = doc.CreateNavigator();
var nsmgr = new XmlNamespaceManager(nav.NameTable);
nsmgr.AddNamespace("p", "http://schemas.microsoft.com/developer/msbuild/2003");
var assemblyName = nav.SelectSingleNode("/p:Project/p:PropertyGroup/p:AssemblyName/text()", nsmgr).Value;
但是,我觉得不合理的是,当它是根节点的属性时,我必须指定XML命名空间(<Project>
)
所以我的问题是 - 如何使用根节点的命名空间而不在此处复制它?简洁代码加分。
P.S.
我完全清楚我可以读取程序集名称,只需“grepping”相应的行并对其进行解析。我对这里的 XML 特别感兴趣。
编辑 1
csproj 文件是:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)$(MSBuildToolsVersion)\Microsoft.Common.props" />
<PropertyGroup>
<ProjectType>Local</ProjectType>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{09082B9A-906C-4A17-A2E5-6C947DAC7C85}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ApplicationIcon>
</ApplicationIcon>
<AssemblyKeyContainerName>
</AssemblyKeyContainerName>
<AssemblyName>MyApp</AssemblyName>
<OutputType>Exe</OutputType>
...
导航到某个元素后,您可以使用 GetNamespacesInScope()
检索本地范围的命名空间并在您的代码中使用它。
var doc = new XPathDocument(projectFilePath);
var nav = doc.CreateNavigator();
var nsmgr = new XmlNamespaceManager(nav.NameTable);
nav.MoveToFollowing(XPathNodeType.Element);
var ns = nav.GetNamespacesInScope(XmlNamespaceScope.Local).FirstOrDefault();
nsmgr.AddNamespace("p", ns.Value);
var assemblyName = nav.SelectSingleNode(
"/p:Project/p:PropertyGroup/p:AssemblyName/text()", nsmgr).Value;
我的代码是:
var doc = new XPathDocument(projectFilePath);
var nav = doc.CreateNavigator();
var nsmgr = new XmlNamespaceManager(nav.NameTable);
nsmgr.AddNamespace("p", "http://schemas.microsoft.com/developer/msbuild/2003");
var assemblyName = nav.SelectSingleNode("/p:Project/p:PropertyGroup/p:AssemblyName/text()", nsmgr).Value;
但是,我觉得不合理的是,当它是根节点的属性时,我必须指定XML命名空间(<Project>
)
所以我的问题是 - 如何使用根节点的命名空间而不在此处复制它?简洁代码加分。
P.S.
我完全清楚我可以读取程序集名称,只需“grepping”相应的行并对其进行解析。我对这里的 XML 特别感兴趣。
编辑 1
csproj 文件是:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)$(MSBuildToolsVersion)\Microsoft.Common.props" />
<PropertyGroup>
<ProjectType>Local</ProjectType>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{09082B9A-906C-4A17-A2E5-6C947DAC7C85}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ApplicationIcon>
</ApplicationIcon>
<AssemblyKeyContainerName>
</AssemblyKeyContainerName>
<AssemblyName>MyApp</AssemblyName>
<OutputType>Exe</OutputType>
...
导航到某个元素后,您可以使用 GetNamespacesInScope()
检索本地范围的命名空间并在您的代码中使用它。
var doc = new XPathDocument(projectFilePath);
var nav = doc.CreateNavigator();
var nsmgr = new XmlNamespaceManager(nav.NameTable);
nav.MoveToFollowing(XPathNodeType.Element);
var ns = nav.GetNamespacesInScope(XmlNamespaceScope.Local).FirstOrDefault();
nsmgr.AddNamespace("p", ns.Value);
var assemblyName = nav.SelectSingleNode(
"/p:Project/p:PropertyGroup/p:AssemblyName/text()", nsmgr).Value;