0

我的代码是:

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>)

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

附言

我非常清楚我可以读取程序集名称只是“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>
...
4

1 回答 1

0

导航到元素后,您可以使用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;
于 2020-11-05T00:02:08.343 回答