Используя анализ Powershell и XML для поиска разделов с указанным значением, связанных с набором узлов? - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь проанализировать XML-файлы, возвращенные API.Этот API возвращает несколько типов форм, отмеченных в поле «form_id».Я собираюсь использовать XPath или аналогичный метод для анализа только сегментов и полей, содержащихся в определенном «form_id».Пример одного из возвращенных XML-файлов может быть следующим:

<pnet_message_history_packet_response>
    <packet_id>22</packet_id>
    <more_data/>
    <imessage>
            <vehicle_number>121</vehicle_number>
            <created_datetime>11/25/2018 06:53:48</created_datetime>
            <received_datetime>11/25/2018 06:54:11</received_datetime>
            <recipient>
                <recip_uid>77036</recip_uid>
                <recip_name>!Dispatch</recip_name>
            </recipient>
            <msn>37599831</msn>
            <base_msn>0</base_msn>
            <message_type>form</message_type>
            <formdata>
                <form_id>53420</form_id>
                <im_field>
                    <field_number>8</field_number>
                    <empty_at_start>yes</empty_at_start>
                    <driver_modified>yes</driver_modified>
                    <data>
                        <data_text>sb4690</data_text>
                    </data>
                </im_field>
                <im_field>
                    <field_number>12</field_number>
                    <empty_at_start>yes</empty_at_start>
                    <driver_modified>yes</driver_modified>
                    <data>
                        <data_auto_latlong>
                            <latitude>35.1 </latitude>
                            <longitude>-80.1 </longitude>
                    </data>
            </formdata>
            <formdata>
                <form_id>125413</form_id>
                <im_field>
                    <field_number>5</field_number>
                    <empty_at_start>no</empty_at_start>
                    <driver_modified>no</driver_modified>
                    <data>
                        <data_numeric-enhanced>
                            <num_formatted>3734877</num_formatted>
                            <num_raw>3734877</num_raw>
                        </data_numeric-enhanced>
                    </data>
                </im_field>
                <im_field>
                    <field_number>6</field_number>
                    <empty_at_start>yes</empty_at_start>
                    <driver_modified>yes</driver_modified>
                    <data>
                        <data_multiple-choice>
                            <mc_choicenum>2</mc_choicenum>
                            <mc_choicetext>Yes</mc_choicetext>
                        </data_multiple-choice>
                    </data>
                </im_field>
                <im_field>
                    <field_number>12</field_number>
                    <empty_at_start>yes</empty_at_start>
                    <driver_modified>yes</driver_modified>
                    <data>
                        <data_auto_location>501 Sar St</data_auto_location>
                    </data>
                </im_field>
                <im_field>
                    <field_number>13</field_number>
                    <empty_at_start>yes</empty_at_start>
                    <driver_modified>yes</driver_modified>
                    <data>
                        <data_auto_date-time>11/25/2018 06:43:34 GMT</data_auto_date-time>
                    </data>
                </im_field>
            </formdata>

Итак, я хочу получить все данные, прикрепленные к указанным form_ids.В приведенном выше примере я хотел бы получить, например, номер транспортного средства и соответствующие данные для всех form_id 53420. В этом примере будет показано

  • номер транспортного средства 121 и его данные, а именно:
    • form_id 53420 (и ничего для любых других разделов form_id)
      • data_text sb4690 (который относится к автомобилю 121, форма 53420)
      • раздел data_auto_latlong, включая
        • значения раздела широты и долготы (которые относятся к транспортному средству 121, форма 53420)

Первоначальный подход IТребовалось выполнить цикл по сегментам с вложенными операторами if и позициями в массиве.Это больше не жизнеспособно, так как я получаю несколько номеров транспортных средств.Вот пример того, что я делал:

function PullDriverRequestForms {
    Write-Output 'End of new messages'
    $itemlist = Get-ChildItem '.\data*.xml'
    foreach ($item in $itemlist) {
        [xml]$xml = Get-Content $item.FullName |
            Select-Object -Skip 1
        $vehiclenumbers = $xml.pnet_message_history_packet_response.imessage.vehicle_number

        foreach ($num in $vehiclenumbers) {
            $formid = $xml.pnet_message_history_packet_response.imessage.formdata.form_id

            if ($formid -eq 53420) {
                Write-Output "Found Request"
                Write-Output ("FormID: " + $xml.pnet_message_history_packet_response.imessage.formdata.form_id)
                Write-Output ("Vehicle Number: " + $num)
            }
            Write-Output $item.FullName
        }

    }
}
PullDriverRequestForms

Проблема с возвращенными данными в этом случае заключается в том, что когда я печатаю строку, содержащую "Form_ID", указанный в моем операторе if, я получаю коллекциювсех полей Form_ID, связанных с этим номером транспортного средства.Мне нужны только сегменты form_id и соответствующие данные для form_id 53420.

Как я могу хранить свои данные вместе?Как я могу вернуть номер транспортного средства и данные для form_id 53420 ТОЛЬКО для этого конкретного транспортного средства?Мне кажется, что я неправильно понимаю основную часть процесса синтаксического анализа XML-файлов.

Возвращенные данные выглядят примерно так:

Found Request
FormID: 53420 125413 92477... (all form ID fields in the entire document)
Vehicle Number: 121 (seemingly working correctly)

Любая помощь будет принята с благодарностью.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...