InvalidArgument: Невозможно преобразовать значение «System.Object []» в тип «System. Xml .XmlDocument». Ошибка: «Произошел неожиданный конец файла. Следующие элементы не закрыты: asmv1: сборка. Строка 40, позиция 14».
Вам не хватает чего-то подобного в нижней части xml:
</asmv1:assembly>
Если вы правильно сделали отступ $sourcexml.save('stripped.xml')
, вы увидите, что развертывание не является узлом верхнего уровня. Есть также проблема пространства имен.
Вы можете получить $nodes
таким образом. Здесь только один. Я не знаю пространства имен:
$nodes = $sourcexml.assembly.deployment
$nodes
install subscription deploymentProvider
------- ------------ ------------------
true subscription deploymentProvider
Хм, это работает:
select-xml asmv1:assembly stripped.xml -Namespace @{asmv1='urn:schemas-microsoft-com:asm.v1'}
Node Path Pattern
---- ---- -------
assembly /Users/js/foo/stripped.xml asmv1:assembly
Но не это:
select-xml '//deployment' stripped.xml -Namespace @{asmv1='urn:schemas-microsoft-com:asm.v1'}
Тьфу. Это работает. x
может быть чем угодно. Это не может быть xmlns
.
select-xml '//x:deployment' stripped.xml -Namespace @{x='urn:schemas-microsoft-com:asm.v2'}
Node Path Pattern
---- ---- -------
deployment /Users/js/foo/stripped.xml //x:deployment
И, наконец, версия selectnodes () с пространством имен. Вам нужно //
для поиска подузлов, потому что развертывание не является узлом верхнего уровня. Наличие пространства имен делает его более сложным. x
представляет здесь пространство имен по умолчанию.
[System.Xml.XmlNamespaceManager]$nsmgr = $sourcexml.NameTable
$nsmgr.AddNamespace('x','urn:schemas-microsoft-com:asm.v2')
$nodes = $sourcexml.selectnodes('//x:deployment', $nsmgr)
$nodes
install subscription deploymentProvider
------- ------------ ------------------
true subscription deploymentProvider