我想使用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}
答案 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 :