在 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
中的 Value
是 XmlAttribute
的 属性 名称。它不受 XML 中名为 value
.
的属性的影响
当然,您也可以将 XMl 视为文本文件,并使用 SED 等删除命名空间声明。
我有一个 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
中的 Value
是 XmlAttribute
的 属性 名称。它不受 XML 中名为 value
.
当然,您也可以将 XMl 视为文本文件,并使用 SED 等删除命名空间声明。