Как я могу получить значение атрибута через Select-Xml? - PullRequest
0 голосов
/ 03 января 2019

Как получить значение атрибута, используя Select-Xml?

Вот фрагмент файла .dtsx службы SSIS.

<?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 : Cannot convert value "<DTS:Executable xmlns:DTS="www.microsoft.com/
SqlServer/Dts"" to type "System.Xml.XmlDocument". Error: "Unexpected end of file
has occurred. The following elements are not closed:  Line 1, position 60."
At line:1 char:6
+ $x | Select-Xml -XPath '//@ConnectionManagers/@ConnectionManager[@DTS ...
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Select-Xml], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : InvalidCastToXmlDocument,Microsoft.PowerShell.Commands.SelectXmlCommand

1 Ответ

0 голосов
/ 03 января 2019

Прежде всего, вы не передаете данные 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 дают выбранный узел или атрибут (свойство 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 ссылка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...