PowerShell如何读取XML每个row节点下首个object_tag的uid值
PowerShell提取XML指定节点属性实现方案
原有代码的问题:使用//object_tag作为XPath匹配规则时,会抓取XML文档内所有位置的object_tag节点,每个<row>节点下包含2个object_tag,因此最终输出4个uid结果,和预期不符。
要实现仅提取每个<row>节点下第一个object_tag的uid属性,直接调整XPath匹配规则即可,推荐写法如下:
$Xml = @" <?xml version="1.0" encoding="utf-8"?> <DisplayDefinitionTable> <columns> <column_entry order_num="0" relation_to_base="Item.current_name">current_name</column_entry> </columns> <rows> <row> <object_tag tag="91859" uid="TdjJhBMdpQNFhC"/> <object_tag tag="86504" uid="TtvJBp53pQNFhC"/> <row_element column="0" component_tag="91859" property_name="current_name">EAUX</row_element> </row> <row> <object_tag tag="92069" uid="DCuJhBMdpQNFhC"/> <object_tag tag="86504" uid="TtvJBp53pQNFhC"/> <row_element column="0" component_tag="92069" property_name="current_name">VISS</row_element> </row> </rows> </DisplayDefinitionTable> "@ # XPath规则说明:匹配所有row节点下的第一个直接子节点object_tag Select-Xml -Content $Xml -XPath "//row/object_tag[1]" | ForEach-Object {$_.Node.uid}
运行上述代码的输出结果完全符合预期:
TdjJhBMdpQNFhC DCuJhBMdpQNFhC
如果不熟悉XPath的索引写法,也可以用分步遍历的写法,效果一致:
# 先匹配所有row节点,再逐个提取内部第一个object_tag的uid Select-Xml -Content $Xml -XPath "//row" | ForEach-Object { $_.Node.SelectSingleNode("object_tag[1]").uid }
注意:XPath的节点索引从1开始计数,取第一个节点时需要写[1],不能用多数编程语言习惯的0起始索引。
内容的提问来源于stack exchange,提问作者Mice
相关产品推荐
相关产品推荐

