【问题标题】:How can I get the attribute value through Select-Xml?如何通过 Select-Xml 获取属性值?
【发布时间】:2019-01-02 21:52:25
【问题描述】:

如何使用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:无法转换值“

【问题讨论】:

    标签: xml powershell xpath


    【解决方案1】:

    首先,您没有将 XML 数据作为单个字符串传递。这就是导致您观察到的错误的原因,因为行 &lt;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 的输出为您提供选定的节点或属性(属性Node)以及输入项(属性Path)和XPath 表达式(属性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 reference

    【讨论】:

      【解决方案2】:

      这个解决方案可能很有用:

      $rootpath  = 'C:\Users\EricBellet\Desktop\Test\'
      $filename = 'connections.txt'
      
      $ns = @{DTS='www.microsoft.com/SqlServer/Dts'}
      $objectname = '//DTS:ConnectionManagers/DTS:ConnectionManager/@DTS:ObjectName'
      $connectionstring = '//DTS:ConnectionManagers/DTS:ConnectionManager/DTS:ObjectData/DTS:ConnectionManager/@DTS:ConnectionString'
      
      
      Get-ChildItem $rootpath -Include *.dtsx -Recurse | % { $_.FullName >> $filename; Select-Xml -Path $_.FullName -XPath $objectname -Namespace $ns | Select-Object -Expand Node | Select-Object -Expand '#text' >> $filename; Select-Xml -Path $_.FullName-XPath $connectionstring -Namespace $ns | Select-Object -Expand Node | Select-Object -Expand '#text' >> $filename; '' >> $filename; }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-15
        • 2015-08-28
        相关资源
        最近更新 更多