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

km0tfn4u  于 2023-05-22  发布在  Shell
关注(0)|答案(2)|浏览(236)

我试图加载一个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

我修改了TestInner 2下的元素-添加了额外的元素,自封闭元素。我已经为Test添加了一个命名空间。仍然能够在这些情况下设置值。
当在powershell伊势中,获取类型的intellisense时,我注意到在我的测试xml中,每个Test,TestInner 1和TestInner 2都是XmlElements。然而,在项目文件中,Project和PropertyGroup是XmlElements -但随后Intellisense停止并且不提供RootNamespace。当我得到PropertyGroup的类型时,它是一个Object[],RootNamespace的类型是string。RootNamespace声明具有{ get;但是我在设置时遇到了上述错误。
如果有一个工作在项目文件的变通方法,我很感兴趣,但我同样有兴趣知道为什么上面的两个例子不同,即我错过了什么!

tkclm6bt

tkclm6bt1#

项目节点下有多个PropertyGroup节点。通常是这样
如果只有一个元素,XmlDocument类将返回第一个元素,但如果有更多元素,则需要索引。您的Test示例之所以有效,是因为只有一个名为TestInner2的子元素。如果知道PropertyGroup元素的位置,可以通过索引访问

$xmlDoc.Project.PropertyGroup[0].RootNamespace

或者你使用原力使xml屈从于你的意志

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

wrrgggsh2#

这个也行

$propertyGroupNode = $xmlDoc.SelectSingleNode("//Project/PropertyGroup")
$propertyGroupNode.RootNamespace = "new value"

相关问题