在Powershell中设置xml值失败,导致属性'...'在此对象上找不到

Dis*_*oat 4 xml powershell

我正在尝试加载csproj文件并在Powershell中更改它的根名称空间。

csproj文件的xml如下所示:

<Project...xmlsns="   >
    <PropertyGroup>
        <RootNamespace>SomeNamespace</RootNamespace>
Run Code Online (Sandbox Code Playgroud)

...

我可以获取价值,按属性浏览

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

> $xmlDoc.Project.PropertyGroup.RootNamespace ## Outputs SomeNamespace
Run Code Online (Sandbox Code Playgroud)

但是我无法分配给它-在Powershell中设置xml值失败,并在该对象上找不到属性'...'...

我已经用手工制作的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
Run Code Online (Sandbox Code Playgroud)

我修改了TestInner2下的元素-添加了其他元素,即自封闭元素。我已经为Test添加了名称空间。在每种情况下仍然能够设置值。

在Powershell ISE中,获取类型的智能感知我注意到,在我的测试xml中,每个Test,TestInner1和TestInner2都是XmlElements。但是,在项目文件上,Project和PropertyGroup是XmlElements-但是Intellisense停止了,并且不提供RootNamespace。当我得到PropertyGroup的类型时,它是一个Object [],而RootNamespace是字符串。RootNamespace声称是{get; 组; 但我在设置时遇到了上述错误。

如果有一个对项目文件有效的解决方法,我很感兴趣,但是我同样也想知道为什么上面两个示例不同,即我缺少了什么!

Ser*_*x86 6

项目”节点下有多个“ PropertyGroup 节点。通常。

如果只有一个元素,则XmlDocument类将返回第一个元素,但是如果有更多元素,它将需要一个索引。您的Test示例之所以有效,是因为只有一个名为TestInner2的子元素。如果知道PropertyGroup元素的位置,则可以按索引访问它

$xmlDoc.Project.PropertyGroup[0].RootNamespace
Run Code Online (Sandbox Code Playgroud)

或者您使用Force将xml弯曲到您的意愿

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