У меня есть некоторый код, который, кажется, работает, в нем он печатает то, что я ожидаю, но кажется, что есть хотя бы один из множества foreach
операторов.Первоначально у меня были те же данные в JSON, но чтобы заставить их работать с PS2, я думал, что XML облегчит это.Версия JSON показалась довольно простой в сравнении.Код выглядит следующим образом.Буду признателен за любой вклад, если это правильно.Я убежден, что должен быть лучший способ.
$xmldata = [xml]@"
<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<Components>
<ITEM1>
<name>
<element>test1</element>
</name>
<info1>
<element>info1-e1</element>
<element>info1-e2</element>
</info1>
<info2>
<element>info2-e1</element>
<element>info2-e2</element>
</info2>
</ITEM1>
<ITEM2>
<name>
<element>test2</element>
</name>
<info2>
<element>info2-e1</element>
<element>info2-e2</element>
</info2>
<info2>
<element>info2-e1</element>
<element>info2-e2</element>
</info2>
</ITEM2>
</Components>
</DATA>
"@
$xmldata | Select-Xml -XPath "//DATA/Components" | foreach {
foreach ($x in $_.node) {
foreach ($itemToProcess in $x.ChildNodes) {
Write-Host "Name:" $($itemToProcess.name.element)
#Process Info1
if ($itemToProcess.info1) {
foreach ($e in $itemToProcess.info1.element) {
Write-Host "`tElement:" $e
}
}
#Process Info2
if ($itemToProcess.info2) {
foreach ($e in $itemToProcess.info2.element) {
Write-Host "`tElement:" $e
}
}
}
}
}
Это ответ, или я все еще пропускаю трюк?У меня на одного меньше foreach
.
$l1 = 0
$l2 = 0
$xmldata | Select-Xml -XPath "//DATA/Components" | foreach {
foreach ($itemToProcess in $_.node.ChildNodes) {
Write-Host "Name:" $($itemToProcess.name.element)
#Process Info1
if ($itemToProcess.info1) {
foreach ($e in $itemToProcess.info1.element) {
Write-Host "`tElement:" $e
}
}
#Process Info2
if ($itemToProcess.info2) {
foreach ($e in $itemToProcess.info2.element) {
Write-Host "`tElement:" $e
}
}
$l2++
}
$l1++
}
Write-Host "Number of outer foreach" $l1
Write-Host "Number of inner foreach" $l2