Я пытаюсь проанализировать 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)
Любая помощь будет принята с благодарностью.Спасибо.