XPath 基于同级值获取值 - 使用命名空间
XPath Get Value based on sibling value - with namespace
有很多不涉及名称空间的答案,但我在名称空间方面遇到了问题。
这是 xml 文档:
<GetServiceRequestDetailsResponse xmlns="http://lcc.catscrm">
<GetServiceRequestDetailsResult xmlns:a="http://schemas.datacontract.org/2004/07/LCC.CATS.CRM.WCF.Model" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:AltRefs>
<a:AltRefModel>
<a:Name>UTRN</a:Name>
<a:TypeId>7577</a:TypeId>
<a:Value>9024930</a:Value>
</a:AltRefModel>
</a:AltRefs>
<a:Customer>
<a:Address>
<a:Address1>5</a:Address1>
<a:Address2>Random</a:Address2>
<a:County>West Yorks</a:County>
<a:NumberName>5</a:NumberName>
<a:Postcode>L1</a:Postcode>
<a:TownCity>London</a:TownCity>
<a:UPRN i:nil="true"/>
</a:Address>
<a:AltRefs/>
<a:ContactTransports>
<a:ContactTransport>
<a:Name>MobileNumber</a:Name>
<a:TypeId>3</a:TypeId>
<a:Value>08965</a:Value>
</a:ContactTransport>
<a:ContactTransport>
<a:Name>Email</a:Name>
<a:TypeId>1</a:TypeId>
<a:Value>a@b.com</a:Value>
</a:ContactTransport>
</a:ContactTransports>
<a:CustomerUPRN i:nil="true"/>
<a:FirstName>Rob</a:FirstName>
<a:Id i:nil="true"/>
<a:LastName>Bowman</a:LastName>
</a:Customer>
</GetServiceRequestDetailsResult>
我需要获取 /ContractTransport/Value,其中 /ContractTransport/Name='Email'。
以下 xpath 让我进入 ContactTransport /*[local-name()='GetServiceRequestDetailsResponse']/*[local-name()='GetServiceRequestDetailsResult']/*[local-name()='Customer']/*[local-name()='ContactTransports']/*[local-name()='ContactTransport']
如果没有名称空间,那么我想我可以使用 [Name='Email]/*[local-name()='Value'] 作为后缀,但这现在不起作用。
您可以添加
/*[local-name()="Value" and preceding-sibling::*[local-name()="Name" and .="Email"]]
到您现有的 XPath 以获得所需的输出
这可能不是最优雅的选择,但这是一个:
//*[local-name()='ContactTransport']/*[local-name()='Value' and ../*[local-name()='Name' and text()='Email']]
这将 select ContactTransport
下的所有 Value
元素,这些元素的 Name
文本为 Email
。 Demo.
有很多不涉及名称空间的答案,但我在名称空间方面遇到了问题。
这是 xml 文档:
<GetServiceRequestDetailsResponse xmlns="http://lcc.catscrm">
<GetServiceRequestDetailsResult xmlns:a="http://schemas.datacontract.org/2004/07/LCC.CATS.CRM.WCF.Model" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:AltRefs>
<a:AltRefModel>
<a:Name>UTRN</a:Name>
<a:TypeId>7577</a:TypeId>
<a:Value>9024930</a:Value>
</a:AltRefModel>
</a:AltRefs>
<a:Customer>
<a:Address>
<a:Address1>5</a:Address1>
<a:Address2>Random</a:Address2>
<a:County>West Yorks</a:County>
<a:NumberName>5</a:NumberName>
<a:Postcode>L1</a:Postcode>
<a:TownCity>London</a:TownCity>
<a:UPRN i:nil="true"/>
</a:Address>
<a:AltRefs/>
<a:ContactTransports>
<a:ContactTransport>
<a:Name>MobileNumber</a:Name>
<a:TypeId>3</a:TypeId>
<a:Value>08965</a:Value>
</a:ContactTransport>
<a:ContactTransport>
<a:Name>Email</a:Name>
<a:TypeId>1</a:TypeId>
<a:Value>a@b.com</a:Value>
</a:ContactTransport>
</a:ContactTransports>
<a:CustomerUPRN i:nil="true"/>
<a:FirstName>Rob</a:FirstName>
<a:Id i:nil="true"/>
<a:LastName>Bowman</a:LastName>
</a:Customer>
</GetServiceRequestDetailsResult>
我需要获取 /ContractTransport/Value,其中 /ContractTransport/Name='Email'。
以下 xpath 让我进入 ContactTransport /*[local-name()='GetServiceRequestDetailsResponse']/*[local-name()='GetServiceRequestDetailsResult']/*[local-name()='Customer']/*[local-name()='ContactTransports']/*[local-name()='ContactTransport']
如果没有名称空间,那么我想我可以使用 [Name='Email]/*[local-name()='Value'] 作为后缀,但这现在不起作用。
您可以添加
/*[local-name()="Value" and preceding-sibling::*[local-name()="Name" and .="Email"]]
到您现有的 XPath 以获得所需的输出
这可能不是最优雅的选择,但这是一个:
//*[local-name()='ContactTransport']/*[local-name()='Value' and ../*[local-name()='Name' and text()='Email']]
这将 select ContactTransport
下的所有 Value
元素,这些元素的 Name
文本为 Email
。 Demo.