【问题标题】:access #text property of XMLAttribute in powershell在powershell中访问XMLAttribute的#text属性
【发布时间】:2015-05-29 08:31:57
【问题描述】:

我有一个格式如下的 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 和值。

【问题讨论】:

    标签: xml powershell xpath xml-attribute


    【解决方案1】:

    除了#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 的属性的影响。

    【讨论】:

    • 实际上,问题是我使用selectnodes 而不是像你那样使用selectsinglenode。当我刚刚回显我的$attr 时,powershell 每次都会向我显示#text 的值,并且如果我执行$attr | gm,也会说返回的类型是XmlAttribute。但实际上,返回的类型似乎是一个数组或集合——当然——没有value 属性。将我的方法与$attr[0].value 一起使用而不是$attr.value 也可以,但正是您的回答和对selectsinglenode 的使用使我走向了正确的方向;)谢谢:)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 欢迎来到 SO。这是一个答案还是一个评论,这是值得商榷的;另请参阅stackoverflow.com/questions/1732348/…,了解 SO 的一些人如何考虑使用正则表达式解析 XML:|
      • 是的,更多的是评论而不是答案,因为它甚至不提供解决方案,而只是一个想法。不过感谢您的意见。
      猜你喜欢
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 2018-01-15
      • 2022-10-04
      • 2012-10-22
      • 1970-01-01
      相关资源
      最近更新 更多