我有一个这样的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。
答案 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.Value
是XmlAttribute
的属性名称。它没有受到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等删除命名空间声明。