access #text property of XMLAttribute in powershell

女生的网名这么多〃 提交于 2020-02-03 05:38:04

问题


I have an xml document formated like this:

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

now I'd like to change the value attribute of the index element where name is set to "DATE". I get the attribute like this:

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

I can view the value by typing this:

$attr.'#text'

but I can't change it:

$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

how do I change the value of an XMLAttribute?


I'd also like to stick with XPath returning the attribute directly if that's possible because the end-user of that script will define the elements and attributes to change in a config file using XPath.
While using XPath for the attributes as well the user can simply provide the attribute to change and the future-value with just two arguments: the XPath and the value.


回答1:


Besides #text, you can also access XmlAttribute's value via Value property :

$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

Note that Value in $attr.Value is property name of XmlAttribute. It doesn't affected by the fact that the attribute in your XML named value.




回答2:


Don't select the attribute, select the node. The attributes of the node will be represented as properties and can be modified as such:

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

Use a loop if you need to modify several nodes:

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



回答3:


Of course you could also treat the XMl as a text file and have the namespace declarations removed using SED or such.



来源:https://stackoverflow.com/questions/29259590/access-text-property-of-xmlattribute-in-powershell

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!