Это должно решить:
Select-Xml -Xml $datalist -XPath '//ROW' | % { $_.Node.CompName }
Редактировать: в соответствии с MediaAndMicrocode Where-Object должен использоваться для фильтрации недопустимых значений, но в этом случае он работает без него.
В чем проблема?
Что интересно:
poshdev >[62]: $x.ROOT | select -exp row
Select-Object : Property "row" cannot be found.
At line:1 char:17
+ $x.ROOT | select <<<< -exp row
+ CategoryInfo : InvalidArgument: (:PSObject) [Select-Object], PSArgumentException
+ FullyQualifiedErrorId : ExpandPropertyNotFound,Microsoft.PowerShell.Commands.SelectObjectCommand
CompName SoftwareName
-------- ------------
User1 Adobe Reader 9.0
User2 Corel Photoshop 12
Итак, если свойство не может быть найдено, давайте проверим его членов:
$datalist.ROOT | gm
показывает, что это коллекция строк и XmlElement.Основываясь на знаниях, это работает как ожидалось:
$datalist.root[1].row
Это означает, что приведение к [xml] создало 2 элемента: строку (вероятно, из части DTD) и xml.Другой обходной путь - просто удалить часть DTD из XML.