Alex_Piggy
Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Доброе время farag, iNNOKENTIY21 Прошу прощения, не было доступа к компьютеру. У XML есть особенность - "пространство имен"/namespace. Каждая нода имеет дополнительное URI, которое может обозначаться при помощи префикса ("xslt:select") или задаваться по умолчанию. Все префиксы и имя по умолчанию должны быть обозначены в корневом элементе при помощи аттрибутов, начинающихся с "xmlns". Чтобы найти элемент нужно знать это URI, только префикса недостаточно (потому что могут быть одинаковые префиксы с разными именами и наоборот). И если используется пространство имен в XML - то все имена должны быть с префиксом... Пока для MSXML можно было выбрать xsltpattern в качестве диалекта было намного легче... Не работало - потому что на момент написания у меня не было образца inetres.admx и я не знал, есть ли там NameSpaces + XPath вообще-то чувствителен к регистру. Код: [xml]$config = Get-Content -Path inetres.admx -Encoding UTF8 # Создаем массив префикс=URI c одним префиксом. Первый вариант берет URI по умолчанию из файла и присваивает префиксу "ns", второй - более корректный - указывает непосредственно. $NS = @{"ns"=$config.DocumentElement.NamespaceURI} $NS = @{"ns"="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions"} #Для каждого имени ноды добавляем префикс "ns:" Select-Xml -Xml $config -Namespace $NS -XPath "/ns:policyDefinitions/ns:policies/ns:policy[@key='Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings\Lockdown_Zones\1']/ns:elements/ns:enum[@valueName='1405']" Select-Xml -Xml $config -Namespace $NS -XPath "//ns:policy[@key='Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings\Lockdown_Zones\1']//ns:enum[@valueName='1405']" # Аналогично - для методов .SelectSingleNode (вернуть первую подходящую ноду) и .SelectNodes (все подходящие ноды) самого XML. Создает менеджер пространства имен и заполняем его. [System.Xml.XmlNamespaceManager] $NSMgr = $config.NameTable $NSMgr.AddNameSpace("ns",$config.DocumentElement.NamespaceURI) $NSMgr.AddNameSpace("ns","http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions") # Затем использует сами методы $config.SelectSingleNode("/ns:policyDefinitions/ns:policies/ns:policy[@key='Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings\Lockdown_Zones\1']/ns:elements/ns:enum[@valueName='1405']",$NSMgr) $config.SelectNodes("/ns:policyDefinitions/ns:policies/ns:policy[@key='Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings\Lockdown_Zones\1']/ns:elements/ns:enum[@valueName='1405']",$NSMgr) | Проверил в PS 2.0, 4.0, 7.2.5 |