首页 > 解决方案 > 如何通过 Select-Xml 获取属性值?

问题描述

如何使用 获取属性值Select-Xml

这是 SSIS .dtsx 文件的片段。

<?xml version="1.0"?>
<DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts"
  DTS:refId="Package"
  ...
  <DTS:ConnectionManagers>
    <DTS:ConnectionManager
      DTS:refId="Package.ConnectionManagers[DW02.EDW_Source]"
      DTS:CreationName="OLEDB"
      DTS:DTSID="{12F8E4D7-B122-40AF-A3BD-2B283F9EB3A0}"
      DTS:ObjectName="DW02.EDW_Source">

以下代码不会产生所需的结果。如何获取属性值?

$x = Get-Content -Path .\ECW_SPECIALITY.dtsx
$namespace = @{DTS='www.microsoft.com/SqlServer/Dts'}
$x | Select-Xml -XPath '//@ConnectionManagers/@ConnectionManager[@DTS:ObjectName]' -Namespace $namespace

我收到以下错误:

Select-Xml:无法转换值“<DTS:Executable xmlns:DTS="www.microsoft.com/
SqlServer/Dts"" 以键入 "System.Xml.XmlDocument"。错误:“文件意外结束
已经发生了。以下元素未关闭:第 1 行,位置 60。”
在行:1 字符:6
+ $x | Select-Xml -XPath '//@ConnectionManagers/@ConnectionManager[@DTS ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidArgument: (:) [Select-Xml], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : InvalidCastToXmlDocument,Microsoft.PowerShell.Commands.SelectXmlCommand

标签: xmlpowershellxpath

解决方案


首先,您没有将 XML 数据作为单个字符串传递。这就是导致您观察到的错误的原因,因为该行<DTS:Executable ...本身不是有效的 XML。

将文件读入单个字符串:

$x = Get-Content '.\ECW_SPECIALITY.dtsx' -Raw          # PowerShell v3 or later
$x = Get-Content '.\ECW_SPECIALITY.dtsx' | Out-String  # PowerShell v2 or earlier

或将文件直接传递给Select-Xml

Select-Xml -Path '.\ECW_SPECIALITY.dtsx' -XPath ...

但是,仅仅修复它仍然不会给您想要的结果,因为您的 XPath 表达式不正确。

  • 为了选择命名空间节点或属性,命名空间哈希表中定义的前缀必须在 XPath 表达式中使用。
  • @表示一个属性。它不能用于节点
  • 方括号定义过滤所选节点/属性的标准,而不是要选择的节点/属性。您需要它来选择具有特定属性的节点,而不是当您想要选择属性本身时。
  • 的输出Select-Xml为您提供选定的节点或属性 (property Node) 以及输入项 (property Path) 和 XPath 表达式 (property Pattern)。要获取节点/属性的值,您必须展开属性Node。两次。

这应该做你想要的:

$ns    = @{DTS='www.microsoft.com/SqlServer/Dts'}
$path  = '.\ECW_SPECIALITY.dtsx'
$xpath = '//DTS:ConnectionManagers/DTS:ConnectionManager/@DTS:ObjectName'
#           ^node                  ^node                 ^attribute

Select-Xml -Path $path -XPath $xpath -Namespace $ns |
    Select-Object -Expand Node |
    Select-Object -Expand '#text'

有关详细信息,请查看XPath 参考


推荐阅读