使用powershell在xml中获取属性的元素名称

时间:2017-03-17 07:23:59

标签: xml powershell xml-parsing

我想使用powershell获取属性的节点名称。如果我们有相同的内置功能,任何人都可以告诉我。

以下是我的xml文件,名为pricefile.xml

 <model type="model1" name="default" price="12.12" date="some_value">
  <PriceData>
    <item name="watch" price="24.28" date="2013-12-01"/>
    <item name="toy" price="22.34" date="2013-12-02"/>
    <item name="bread" price="24.12" date="2013-12-03"/>
  </PriceData>
 </model>

说我想要获取元素名称&#34; item&#34;对于属性&#34;玩具&#34;。我怎样才能获得这些数据?

这是我到目前为止所做的。

[xml]$item = get-content pricefile.xml
$item.SelectNodes("//item/@*")

给出了以下输出,但我不知道如何从这里或它的父节点获取属性的元素。

#text                                                                                                                                                  
-----                                                                                                                                                  
watch                                                                                                                                                  
24.28                                                                                                                                                  
2013-12-01                                                                                                                                             
toy                                                                                                                                                    
22.34                                                                                                                                                  
2013-12-02                                                                                                                                             
bread                                                                                                                                                  
24.12                                                                                                                                                  
2013-12-03 

如果我使用以下任何一个命令,我没有输出。

[xml]$item = get-content pricefile.xml

$item.SelectNodes("//item/@*").parentnode

$item.SelectNodes("//item/@*") | where {$_.parentnode}

4 个答案:

答案 0 :(得分:2)

首先,选择name属性值为toy的元素:

$toy = $item.SelectSingleNode("//*[@name='toy']")

由于PowerShell试图提供帮助,并将name属性公开为对象的属性,因此我们需要使用属性访问器来获取实际标记Name属性:

$toy.get_Name()

答案 1 :(得分:2)

这是xpath方式:

[xml]$item = @'
  <model type="model1" name="default" price="12.12" date="some_value">
    <PriceData>
      <item name="watch" price="24.28" date="2013-12-01"/>
      <item name="toy" price="22.34" date="2013-12-02"/>
      <item name="bread" price="24.12" date="2013-12-03"/>
    </PriceData>
  </model>
'@

(Select-XML -Xml $item -XPath "//item[@name=""toy""]").Node
(Select-XML -Xml $item -XPath "//item[@name=""toy""]").Node.get_Name()

答案 2 :(得分:1)

这是获得所需信息的另一种方法:

$item.model.PriceData.Item | ? name -eq toy

答案 3 :(得分:1)

给定一个XmlAttribute对象,您可以通过OwnerElement属性获取父元素。请注意ParentNode在这里工作不会起作用,因为XmlAttribute上的值始终为空:

λ $myXmlAttr = $item.SelectSingleNode("//item/@*")
λ $myXmlAttr.OwnerElement.LocalName
item
λ $myXmlAttr | Format-List -Property *


#text           : watch
ParentNode      :
Name            : name
LocalName       : name
NamespaceURI    :
Prefix          :
NodeType        : Attribute
OwnerDocument   : #document
Value           : watch
SchemaInfo      : System.Xml.XmlName
InnerText       :
Specified       : True
OwnerElement    : item
InnerXml        :
BaseURI         :
ChildNodes      : {#text}
PreviousSibling :
NextSibling     :
Attributes      :
FirstChild      : #text
LastChild       : #text
HasChildNodes   : True
IsReadOnly      : False
OuterXml        : name="watch"
PreviousText    :