Ошибка установки значения xml в powershell со свойством ‘ …’ не может быть найдена для этого объекта

#xml #powershell

#xml #powershell

Вопрос:

Я пытаюсь загрузить файл csproj и изменить его корневое пространство имен в powershell.

XML-файл csproj выглядит следующим образом:

 <Project...xmlsns="   >
    <PropertyGroup>
        <RootNamespace>SomeNamespace</RootNamespace>
  

Я могу получить значение, перейдя по свойству

 > $xmlDoc = (Get-Content myProject.csproj)

> $xmlDoc.Project.PropertyGroup.RootNamespace ## Outputs SomeNamespace
  

Но я не могу присвоить ему — установка значения xml в powershell сбой со свойством ‘ …’ не может быть найдена для этого объекта…

Я попробовал это с помощью созданного вручную XML-файла и добился успеха

 <Test>
   <TestInner1>
      <TestInner2>SomeValue</TestInner2>
   </TestInner1>
</Test>

>$xmlDoc = [xml](Get-Content test.xml)
>$xmlDoc.Test.TestInner1.TestInner2 = "Some Other Value"
>$xmlDoc.Test.TestInner1.TestInner2 ## Returns Some Other Value
  

Я изменил элементы в TestInner2 — добавил дополнительные элементы, самозакрывающиеся элементы. Я добавил пространство имен для тестирования. Все еще удается установить значение в каждом из этих случаев.

Когда в powershell ISE, получая intellisense для типов, я отмечаю, что в моем тестовом xml каждый из Test, TestInner1 и TestInner2 являются xmlэлементами. Однако в файле проекта Project и PropertyGroup являются элементами XmlElements, но затем Intellisense останавливается и не предоставляет пространство корневых имен. Когда я получаю тип PropertyGroup, это Object[], а RootNamespace — строка. RootNamespace утверждает, что имеет значение { get; set; }, но я получаю вышеупомянутую ошибку при настройке.

Если есть обходной путь, который работает с файлом проекта, который меня интересует, но мне не менее интересно узнать, почему два приведенных выше примера отличаются, т.е. Чего мне не хватает!

Ответ №1:

В Project node имеется более одного узла PropertyGroup. Обычно.

Класс XmlDocument вернет первый элемент, если есть только один, но если их больше, потребуется индекс. Ваш тестовый пример работает, потому что есть только один вложенный элемент с именем TestInner2. Если вы знаете позицию элемента PropertyGroup, вы можете получить к нему доступ по индексу

 $xmlDoc.Project.PropertyGroup[0].RootNamespace
  

Или вы используете силу, чтобы подчинить xml своей воле

 ($xmlDoc.Project.PropertyGroup | Where-Object { $_['RootNamespace'] -ne $null}).RootNamespace = "new value"
  

Комментарии:

1. Не могу поверить, что я этого не пробовал! В мою защиту другие элементы PropertyGroup были в конце файла csproj (довольно неубедительная защита!). И удивительно, что вы не только исправили мой способ перехода к этому свойству, но и как его аккуратно установить. Спасибо!!

2. Избавил меня от головной боли после игры с этим в течение нескольких минут …. дух… несколько разделов propertygroup …. 🙂