在PowerShell中访问XMLAttribute的#text属性

时间:2015-03-25 15:15:56

标签: xml powershell xpath xml-attribute

我有一个这样的xml文档:

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

现在我想更改name设置为“DATE”的index元素的value属性。我得到这样的属性:

$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和值)即可提供要更改的属性和future-value。

3 个答案:

答案 0 :(得分:4)

除了#text,您还可以通过XmlAttribute媒体资源访问Value的值:

$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

请注意Value中的$attr.ValueXmlAttribute的属性名称。它没有受到XML中名为value

的属性的影响

答案 1 :(得分:3)

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

$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'
}

答案 2 :(得分:0)

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