Итерация по XML

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

Подходящее место для критики рабочего кода - Проверка кода. Stack Overflow предназначен для того, чтобы задать вопрос о коде, который (пока) не работает. Но чтобы ответить на ваш вопрос: да, вложение одного итератора в другой итератор бессмысленно, когда оба они по сути обрабатывают одну и ту же коллекцию. Ваш второй пример кода эквивалентен вашему первому.

Ansgar Wiechers 16.12.2018 14:58

Спасибо @AnsgarWiechers. Я ценю ваше время и вклад.

HelpingHand 16.12.2018 18:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
59
0

Другие вопросы по теме