Powershell / C# XmlDocument выбирает только узлы без атрибутов - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь прочитать файл проекта Visual Studio, чтобы выбрать элемент <PropertyGroup> без атрибутов для извлечения значения из узла <AssemblyName>. сообщение близко к тому, что я ищу, но вместо того, чтобы не иметь специфицированный атрибут c, мне нужно, чтобы у него не было атрибутов

Я попробовал следующее в Powershell без любой успех.

$xml = [System.Xml.XmlDocument]::new();

$xml.Load("WebApplication4.csproj")
$ns = [System.Xml.XmlNamespaceManager]::new($xml.NameTable);
$ns.AddNamespace("prj", "http://schemas.microsoft.com/developer/msbuild/2003")

$xml.SelectNodes("//prj:PropertyGroup", $ns).Count

Есть ли способ использовать синтаксис xpath в методе selectsinglenode, который бы возвратил только один узел без атрибутов?

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.7\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.7\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />
  <Import Project="..\packages\Microsoft.Net.Compilers.2.1.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.2.1.0\build\Microsoft.Net.Compilers.props')" />
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>
    </ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{7EC4A73B-EA1B-4A6C-B2ED-093E3615C40E}</ProjectGuid>
    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>WebApplication4</RootNamespace>
    <AssemblyName>WebApplication4</AssemblyName>
    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
    <UseIISExpress>true</UseIISExpress>
    <Use64BitIISExpress />
    <IISExpressSSLPort />
    <IISExpressAnonymousAuthentication />
    <IISExpressWindowsAuthentication />
    <IISExpressUseClassicPipelineMode />
    <UseGlobalApplicationHostFile />
    <NuGetPackageImportStamp>
    </NuGetPackageImportStamp>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
</Project>

Ответы [ 2 ]

3 голосов
/ 15 февраля 2020

Другой способ сделать это, используя только xpath, может быть:

 $xml.SelectNodes("//prj:PropertyGroup[count(@*)=0]", $ns)
2 голосов
/ 15 февраля 2020

Полезный ответ Джека Флитинга показывает, как это сделать правильно только с XPath.

Следующая альтернатива показывает, как выполнить фильтрацию по факту в коде PowerShell.


Необходимо проверить длину коллекции .Attributes на целевых элементах, чтобы найти элемент (ы) без атрибутов:

$xml.SelectNodes("//prj:PropertyGroup", $ns).Where({ $_.Attributes.Count -eq 0 })

Обратите внимание, что .Where() это метод массива (коллекции), предоставляемый PowerShell, который позволяет фильтровать любую коллекцию через блок скриптов ({ ... }), который должен возвращать $true для каждого элемента ($_), который будет выбран.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...