powershell中XMLAttribute的access#text属性

powershell中XMLAttribute的access#text属性,xml,powershell,xpath,xml-attribute,Xml,Powershell,Xpath,Xml Attribute,我有一个格式如下的xml文档: <root> <obj> <indexlist> <index name="NUMD" value="val1" /> <index name="DATE" value="val2" /> </indexlist> </obj> </root> $attr = $xml.selectnodes("//obj/indexlist/in

我有一个格式如下的xml文档:

<root>
<obj>
   <indexlist>
      <index name="NUMD" value="val1" />
      <index name="DATE" value="val2" />
   </indexlist>
</obj>
</root>
$attr = $xml.selectnodes("//obj/indexlist/index[@name='DATE']/@value")
我可以通过键入以下内容查看值:

$attr.'#text'
但我不能改变它:

$attr.'#text' = 'foo'
The property '#text' cannot be found on this object. Verify that the property exists and can be set.
At line:1 char:1
+ $n.'#text' = 'foo'
+ ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException
如何更改XMLAttribute的值?


如果可能的话,我还希望使用XPath直接返回属性,因为该脚本的最终用户将使用XPath在配置文件中定义要更改的元素和属性。

对于属性也使用XPath时,用户只需提供要更改的属性和未来值,只需两个参数:XPath和值。

不要选择属性,选择节点。节点的属性将表示为属性,并且可以进行如下修改:

$node=$xml.SelectSingleNode(//obj/indexlist/index[@name='DATE'])
$node.value='foo'
如果需要修改多个节点,请使用循环:

$nodes=$xml.SelectNodes(“//obj/indexlist/index[@name='DATE']”)
foreach($节点中的节点){
$node.value='foo'
}
除了
#text
,您还可以通过
value
属性访问
xmldattribute
的值:

$attr = $xml.SelectSingleNode("//obj/indexlist/index[@name='DATE']/@value")

#print old value
$attr.Value

#update attribute value 
$attr.Value = "new value"

#print new value
$attr.Value

请注意,
$attr.Value
中的
Value
xmldattribute
的属性名。它不受XML中名为
value
的属性这一事实的影响。当然,您也可以将XML视为文本文件,并使用SED等删除名称空间声明。

实际上,问题是我使用了
selectnodes
而不是像您那样使用
selectsinglenode
。当我只是回显我的
$attr
时,powershell每次都会向我显示
#text
的值,如果我执行
$attr | gm
,还会说返回的类型是XmlAttribute。但事实上,返回的类型似乎是一个数组或集合,当然,它没有
属性。使用我的方法使用
$attr[0]。value
而不是
$attr.value
也有效,但正是您的回答和对
选择单节点的使用引导我走上了正确的方向;)谢谢:)欢迎光临。这是一个回答还是一个评论值得商榷;另请参见SO的一些人如何考虑使用正则表达式解析XML:|是的,与其说是答案,不如说是评论,因为它甚至没有提供解决方案,而只是一个想法。谢谢你的意见。