如何使用XML从C#中的非SDK样式csproj文件中读取程序集名称?

如何使用XML从C#中的非SDK样式csproj文件中读取程序集名称?,c#,xml,xpathdocument,C#,Xml,Xpathdocument,我的代码是: 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 assembly

我的代码是:

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名称空间是根节点的属性时,我发现必须指定它是不合理的(

所以我的问题是-如何使用根节点的名称空间而不在这里复制它?简洁代码的额外加分

附言

我非常清楚,我可以通过“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>
...

地方的
9.0.30729
2
{09082B9A-906C-4A17-A2E5-6C947DAC7C85}
调试
任意CPU
MyApp
Exe
...

导航到元素后,可以使用
GetNamespacesScope()
检索本地作用域的命名空间,并在代码中使用它

var doc=新的XPathDocument(projectFilePath);
var nav=doc.CreateNavigator();
var nsmgr=新的XmlNamespaceManager(nav.NameTable);
导航移动如下(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;

我不使用XPathDocument,但似乎有一种方法可以实现同样的效果。我已经更新了我的答案。我想知道这是否是最简洁的方式。所有这些名称空间业务似乎都是人为的。