Перебор XML - PullRequest
       6

Перебор XML

0 голосов
/ 16 декабря 2018

У меня есть некоторый код, который, кажется, работает, в нем он печатает то, что я ожидаю, но кажется, что есть хотя бы один из множества 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...