В Powershell, как мне получить Select-Xml для поиска по нескольким узлам
Поэтому я должен сказать, что я новичок в использовании PowerShell для анализа XML. С учетом вышесказанного, как мне объединить несколько -XPath, чтобы я мог закончить создание своего отчета о выражениях. Пожалуйста, дайте мне знать, я пробовал несколько комбинаций, и ни одна из них не работает с пространством имен XML.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" niaVersion="12.0.0.756" xmlns="http://something.com/something/hotfix/manifest">
<releases>
<release name="mid November 2017">
<hotfixes>
<hotfixref name="DE002" description="" defectSuite="n/a" supportEscalation="n/a" internalNotes="" customer="n/a">
<packages>
<package type="All" />
</packages>
<components>
<component type="" />
<component type="" />
</components>
</hotfixref>
<hotfixref name="DE5728" description="" defectSuite="DS001" supportEscalation="n/a" internalNotes="" customer="n/a">
<packages>
<package type="Full" />
</packages>
<components>
<component type="" />
</components>
</hotfixref>
</hotfixes>
</release>
</releases>
</manifest>
[xml]$xdoc=Get-Content $PSScriptRoot\Manifest.xml
$ns = @{test ="http://something.com/something/hotfix/manifest"}
$ver = Select-Xml -Xml $xdoc -XPath '//test:release' -Namespace $ns
$hfu = Select-Xml -Xml $xdoc -XPath '//test:hotfixref' -Namespace $ns
foreach ($v in $ver){
$v | Select-Object -ExpandProperty node
$hfu | Select-Object -ExpandProperty node
1 ответ
Я не могу понять, почему вам нужно найти как исправления, так и релиз-узлы. Release является родителем исправлений, поэтому просто найдите все release-узлы и получите доступ к его дочерним узлам в цикле, чтобы найти соответствующие исправления. Пример:
$xdoc = [xml]@"
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" niaVersion="12.0.0.756" xmlns="http://something.com/something/hotfix/manifest">
<releases>
<release name="mid November 2017">
<hotfixes>
<hotfixref name="DE002" description="" defectSuite="n/a" supportEscalation="n/a" internalNotes="" customer="n/a">
<packages>
<package type="All" />
</packages>
<components>
<component type="" />
<component type="" />
</components>
</hotfixref>
<hotfixref name="DE5728" description="" defectSuite="DS001" supportEscalation="n/a" internalNotes="" customer="n/a">
<packages>
<package type="Full" />
</packages>
<components>
<component type="" />
</components>
</hotfixref>
</hotfixes>
</release>
</releases>
</manifest>
"@
$ns = @{test ="http://something.com/something/hotfix/manifest"}
$releases = Select-Xml -Xml $xdoc -XPath '//test:release' -Namespace $ns
foreach ($r in $releases){
"$($r.node.name) contains the following hotfixes:"
$r.node.hotfixes.hotfixref | Select-Object Name, description, defectSuite
}
Выход:
mid November 2017 contains the following hotfixes:
name description defectSuite
---- ----------- -----------
DE002 n/a
DE5728 DS001
Если вы действительно хотите, чтобы один xpath-запрос нашел оба типа, используйте |
(ИЛИ) для разделения xpath-запросов. Пример:
Select-Xml -Xml $xdoc -XPath '//test:release|//test:hotfixref' -Namespace $ns
Node Path Pattern
---- ---- -------
release InputStream //test:release|//test:hotfixref
hotfixref InputStream //test:release|//test:hotfixref
hotfixref InputStream //test:release|//test:hotfixref
Проблема в том, что вам понадобится логика, чтобы определить, к какому типу узлов вы обращаетесь, поскольку это может быть релиз или hotfixref. Вам также понадобится дополнительная логика, чтобы понять, какое исправление относится к какому выпуску.