我正在尝试搜索一个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
无法理解它。