在 powershell 中访问 XMLAttribute 的 #text 属性

access #text property of XMLAttribute in powershell

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

<root>
<obj>
   <indexlist>
      <index name="NUMD" value="val1" />
      <index name="DATE" value="val2" />
   </indexlist>
</obj>
</root>

现在我想更改名称设置为 "DATE" 的索引元素的值属性。我得到这样的属性:

$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 和值。

不要select属性,select节点。节点的属性将表示为属性,可以这样修改:

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

如果需要修改多个节点,请使用循环:

$nodes = $xml.SelectNodes("//obj/indexlist/index[@name='DATE']")
foreach ($node in $nodes) {
  $node.value = 'foo'
}

除了#text,您还可以通过Value访问XmlAttribute的值 属性 :

$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 中的 ValueXmlAttribute 的 属性 名称。它不受 XML 中名为 value.

的属性的影响

当然,您也可以将 XMl 视为文本文件,并使用 SED 等删除命名空间声明。