2017-08-30 143 views
1

在PowerShell中,我试图检索使用XPath属性的值。在下面的例子中,我想为“hi”类别获得“name”的值,这将是“新测试”。使用XPath检索属性值的特定属性

示例代码所示:

<Report name="test" category="thisone"> 
    <String>test</String> 
    <String>test2</String> 
    <Report name="new test" category="hi"> 
    <String>hello</String> 
    <String>hi again</String> 
    </Report> 
</Report> 

这是我有:

Select-Xml -XPath "//Report[@name='test']/Report" | Select name | 
    Out-File "result.txt" 

我的结果是:

 
name 
---- 

我并不真的需要指定类别属性因为<Report>标签将永远在第一个<Report> ta之后g,所以这就是为什么我认为使用XPath会更容易。

回答

2

您需要首先展开节点。 Select-XML正在提供该对象。如果你这样做:

Select-Xml -Xml $XML -XPath "//Report[@name='test']/Report" 

你会得到

节点:报告

路径:InputStream的

模式://报告[@名称= '测试'] /报告

一旦展开“节点”,你会得到一堆更多的属性

Select-Xml -Xml $XML -xPath "//Report[@name='test']/Report" | Select-Object –ExpandProperty “node” | select * 

名称:新的测试

类别:喜

字符串:{你好,喜再次}

的localName:报告

...等...等

以下完整概念

[xml]$XML = @" 
<Report name="test" category="thisone"> 
<String>test</String> 
<String>test2</String> 
    <Report name="new test" category="hi"> 
    <String>hello</String> 
    <String>hi again</String> 
    </Report> 
</Report> 
"@ 

Select-Xml -Xml $XML -xPath "//Report[@name='test']/Report" | Select-Object –ExpandProperty “node” | select name 
+0

完美是做到了!顺便说一句,我可以将该值放入一个变量中,在该语句之前添加诸如$ hi =的内容吗?我目前正在使用Out-File到一个文本文件,并且我看到它写入了“name”和“----”,然后是下面的值,我并不真正关心这两行并试图消除它们。 。 – Awsmike

+0

'选择的XML-XML $ XML -xPath “//报告[@名称= '测试'] /报告” | Select-Object -ExpandProperty“节点”| foreach-object {$ _。name} | Out-file“HELLO.TXT”' – ArcSet

+0

好!这也工作得很好!有没有一种方法可以将它分配给一个变量?我试过了,我得到这个:命令流水线位置的cmdlet Select-Xml 1 以下参数的供应值: Xml [0]: – Awsmike

0

XPath可以直接获取属性的值。

(Select-Xml -Xml $XML -xPath "//Report[@name='test']/Report/@name").Node.Value 

(但仍需要提取值形成最终[XmlAttribute]