我正在尝试从XML中读取数据到PowerShell中。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="tmp.xslt"?>
<Book>
<Subbook id="1848">
<variable Name="Metadata_Code" Value="A-"/>
<variable Name="Metadata_Installation" Value="pod - A"/>
<Topic...>
<Topic....>
</Subbook>
<Subbook id="1849">
<variable Name="Metadata_Code" Value="B-"/>
<variable Name="Metadata_Installation" Value="pod - B"/>
<Topic...>
<Topic....>
</Subbook>
</Book>
我想循环所有Subbook元素。每个Subbook元素都包含一些可变元素。此外,它还包含了我必须处理的其他元素。我可以设置循环。
[xml]$xmlfile = Get-Content -Path $xmlpath
$subbooks = Select-Xml -Path $xmlpath -XPath '//Subbook'
$subbooks | ForEach-Object {
$MDC = $_.Node.SelectNodes('variable[@Name="Metadata_Code"]/@Value')
}
但我被困住了。我需要选择名为“Metadata_Code”的变量节点的值。在XSLT中,这是变量[@Name ='Metadata_Code']/@Value
$MDC仍为空。我怎样才能得到我需要的值到这个变量?
3条答案
按热度按时间twh00eeo1#
假设您在示例XML中查找的是
A-
和B-
,如果您希望使用PowerShell执行过滤,则代码如下所示:atmip9wb2#
Santiago's helpful answer向您展示了如何使用PowerShell's dot-notation-based adaptation of the
[xml]
DOM解决问题。至于您的基于XPath的尝试:
tl;dr:您的代码 * 工作正常,但显示错误使您无法意识到这一点。详情如下。
***
$MDC
实际上并不是 * 空 *,但是您尝试 * 可视化 * 它包含的System.Xml.XmlNodeList
示例(由.SelectNodes()
返回)的方式,即通过Write-Host
导致 * 没有显示输出 *。Write-Host
来显示 * 复杂对象 * 很少有帮助。Write-Host
is typically the wrong tool to use,除非意图是只写 * 到显示 *,绕过成功输出流,并能够将输出发送到其他命令,将其捕获在变量中,或将其重定向到文件。要输出一个值,请使用它 * 本身 *;例如,$MDC
,而不是Write-Host $MDC
(或使用Write-Output $MDC
);参见this answer。要显式地只打印到显示器 * 但使用丰富格式 *,请使用Out-Host
。$MDC
中示例System.Xml.XmlAttribute
的.Value
属性,以便仅获取属性的 value(文本)。.SelectSingleNode()
而不是.SelectNodes()
除此之外,您的代码可以简化。下面是一个包含示例XML的自包含示例:
输出(在上面的管道前添加类似
$MDC =
的内容,以在变量中捕获输出字符串):bfrts1fy3#
问题是
输出节点集。我使用Write-Host $MDC来查看内容,当变量content是一个节点集时,它不显示任何内容。
这就是我一直在寻找的价值: