我正在尝试加载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;组;但是我在设置时遇到了上述错误。
如果有一个解决方法适用于我感兴趣的项目文件,但我同样有兴趣知道为什么上面两个例子不同,即我缺少什么!
答案 0 :(得分:6)
项目节点下有多个 PropertyGroup 节点。一般
如果只有一个元素,XmlDocument类将返回第一个元素,但如果有更多元素则需要索引。您的测试示例有效,因为只有一个名为 TestInner2 的子元素。如果您知道 PropertyGroup 元素的位置,则可以通过索引
访问它$xmlDoc.Project.PropertyGroup[0].RootNamespace
或者您使用Force将xml弯曲到您的意愿
($xmlDoc.Project.PropertyGroup | Where-Object { $_['RootNamespace'] -ne $null}).RootNamespace = "new value"