PowerShell search XML содержимое файла - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь найти файл xml, который имеет несколько разделов, называемых Custom_ID для одного, в частности, я просматривал этот сайт , который указывает, что я должен быть в состоянии сделать фильтр.

После того как я определил раздел, мне нужно получить Custom_ID_Shared_Reference.ID

. Я могу получить их все, используя

$Val = ([xml]$WD_UpdateAccount.Content).envelope.body.Get_Change_Other_IDs_Response.Response_Data.Change_Other_IDs.Change_Other_IDs_Data.Custom_Identification_Data.Custom_ID

. глядя на

$val.Custom_ID_Data.ID_Type_Reference.ID

Но когда я пытаюсь фильтровать, я не получаю результатов. Я пробовал различные where-object -like -contains et c, но я думаю, что более вероятно бит Custom_ID_Data.ID_Type_Reference.ID я делаю неправильно

$Val = ([xml]$WD_UpdateAccount.Content).envelope.body.Get_Change_Other_IDs_Response.Response_Data.Change_Other_IDs.Change_Other_IDs_Data.Custom_Identification_Data.Custom_ID | Where-Object {$_.Custom_ID_Data.ID_Type_Reference.ID -contains 'Active_Directory_Username'}

пример xml

<wd:Custom_ID>
    <wd:Custom_ID_Reference>
        <wd:ID wd:type="WID">922a9f7f0412035621dd3baca7f23e21f10a</wd:ID>
    </wd:Custom_ID_Reference>
    <wd:Custom_ID_Data>
        <wd:ID>Kimi Raikkonen3</wd:ID>
        <wd:ID_Type_Reference>
            <wd:ID wd:type="WID">e60e1796143f501cdb08</wd:ID>
            <wd:ID wd:type="Custom_ID_Type_ID"
                >Active_Directory_Username</wd:ID>
        </wd:ID_Type_Reference>
    </wd:Custom_ID_Data>
    <wd:Custom_ID_Shared_Reference>
        <wd:ID wd:type="WID">aedd9ad02</wd:ID>
        <wd:ID wd:type="Custom_Identifier_Reference_ID"
            >CUSTOM_IDENTIFIER_REFERENCE-6-1</wd:ID>
    </wd:Custom_ID_Shared_Reference>
</wd:Custom_ID>

Любая помощь приветствуется, когда мне впервые пришлось работать с XML.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Я не понимаю все ссылки на узлы в вашем коде. Работая с xml, который вы указали, и поместив в пространство 1 ложное пространство имен:

<wd:Custom_ID xmlns:wd="whatever">
[xml]$xml = get-content file.xml

$xml.custom_id | where { $_.custom_id_data.id_type_reference.id.'#text' -contains 
  'active_directory_username' }                                     


wd       Custom_ID_Reference Custom_ID_Data Custom_ID_Shared_Reference
--       ------------------- -------------- --------------------------
whatever Custom_ID_Reference Custom_ID_Data Custom_ID_Shared_Reference

Объект id имеет свойства type и #text.

$xml.custom_id.custom_id_data.id_type_reference.id

type              #text
----              -----
WID               e60e1796143f501cdb08
Custom_ID_Type_ID Active_Directory_Username

Попытка чего-либо с выражением xpath, которое дает тот же результат, обходя пространство имен:

select-xml '//*[text()="Active_Directory_Username"]/../../..' file.xml | % node


wd       Custom_ID_Reference Custom_ID_Data Custom_ID_Shared_Reference
--       ------------------- -------------- --------------------------
whatever Custom_ID_Reference Custom_ID_Data Custom_ID_Shared_Reference
0 голосов
/ 07 апреля 2020

Попробуйте вместо этого:

@(([xml]$WD_UpdateAccount.Content).envelope.body.Get_Change_Other_IDs_Response.Response_Data.Change_Other_IDs.Change_Other_IDs_Data.Custom_Identification_Data.Custom_ID) | Where-Object {$_.Custom_ID_Data.ID_Type_Reference.ID -contains 'Active_Directory_Username'}

... дополнительная оболочка @() преобразует объект в базовый тип массива, что позволит соответствующему Where-Object быть в состоянии понять, что передается вниз по конвейеру.

По сути, проблема заключается в типе объекта xml, который возвращается и который не понят Where-Object.

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