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

时间:2014-06-24 11:40:06

标签: xml powershell

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

csproj文件的xml如下所示:

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

...

我可以获取值,按属性导航

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

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

但是我无法分配它 - 在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

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

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

如果有一个解决方法适用于我感兴趣的项目文件,但我同样有兴趣知道为什么上面两个例子不同,即我缺少什么!

1 个答案:

答案 0 :(得分:6)

项目节点下有多个 PropertyGroup 节点。一般

如果只有一个元素,XmlDocument类将返回第一个元素,但如果有更多元素则需要索引。您的测试示例有效,因为只有一个名为 TestInner2 的子元素。如果您知道 PropertyGroup 元素的位置,则可以通过索引

访问它
$xmlDoc.Project.PropertyGroup[0].RootNamespace

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

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