PowerShell 搜索 XML 文件内容



我正在尝试搜索一个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

但是当我尝试过滤时,我没有得到任何结果。 我已经尝试了各种位置对象 - 类似 - 包含等,但我认为它更有可能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。

我不明白你代码中的所有节点引用。 从您给出的 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 对象具有类型和 #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

试试这个:

@(([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无法理解它。

最新更新