查询 XML 具有长、多特殊字符、路径名的数据
Querying XML data with a long, multi special character, path name
刚刚开始使用 BaseX 的 XQuery。
我没有创建也无法控制的XML结构,看起来像这样:
2002test.xml:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:runSearchResponse xmlns:ns2="http://externalapi.business.footprints.numarasoftware.com/">
<return>
<_items>
<_containerDefinitionId>1234</_containerDefinitionId>
<_containerDefinitionName>Service Desk</_containerDefinitionName>
<_itemDefinitionId>2244</_itemDefinitionId>
<_itemDefinitionName>Service Request</_itemDefinitionName>
<_itemId>9989</_itemId>
<_itemFields>
<itemFields>
<fieldName>Icon Name</fieldName>
<fieldValue>
<value>default_ticket.png</value>
</fieldValue>
</itemFields>
<itemFields>
<fieldName>emailCustomerUpdate</fieldName>
<fieldValue>
<value>false</value>
</fieldValue>
</itemFields>
<itemFields>
<fieldName>bestContactNumber_Customer</fieldName>
<fieldValue>
<value/>
</fieldValue>
</itemFields>
</_itemFields>
</_items>
</return>
</ns2:runSearchResponse>
</soap:Body>
</soap:Envelope>
做一个简单的:
for $x in doc("2002test.xml")
return $x
returns 我的整个文档都符合预期。
然而,任何深入研究的尝试对我来说都不起作用。
我试过:
for $x in doc("2002test.xml")/soap:Envelope/soap:Body/ns2:runSearchResponse/return
return $x/_items/itemFields/fieldName
但是长路径会抛出“没有为 'soap:Envelope' 声明的命名空间”。
所以我尝试这样声明路径:
declare variable $m := "/soap:Envelope/soap:Body/ns2:runSearchResponse/return";
for $x in doc("2002test.xml")//$m
return $x
这让我:
/soap:Envelope/soap:Body/ns2:runSearchResponse/return
/soap:Envelope/soap:Body/ns2:runSearchResponse/return
/soap:Envelope/soap:Body/ns2:runSearchResponse/return
...
我试过了:
for $x in doc("2002test.xml")/*[local-name()='soap:Envelope'][local-name()='soap:Body'][local-name()='ns2:runSearchResponse'][local-name()='return']
return $x
什么都没做。
很简单,我希望能够做这样的事情:
for $x in doc("2002test.xml")
where $x/return/_items/_itemFields/itemFields/fieldValue/value="default_ticket.png"
return $x/return/_items/_itemFields/itemFields/fieldName/text()
导致:
Icon Name
有什么建议吗?
使用带有谓词的基本 XPath 表达式,例如
doc("2002test.xml")//itemFields[fieldValue/value = "default_ticket.png"]/fieldName/text()
如果您认为需要 FLOWR 表达式,请使用例如
for $field in doc("2002test.xml")//itemFields
where $field/fieldValue/value = "default_ticket.png"
return $field/fieldName/text()
刚刚开始使用 BaseX 的 XQuery。
我没有创建也无法控制的XML结构,看起来像这样:
2002test.xml:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:runSearchResponse xmlns:ns2="http://externalapi.business.footprints.numarasoftware.com/">
<return>
<_items>
<_containerDefinitionId>1234</_containerDefinitionId>
<_containerDefinitionName>Service Desk</_containerDefinitionName>
<_itemDefinitionId>2244</_itemDefinitionId>
<_itemDefinitionName>Service Request</_itemDefinitionName>
<_itemId>9989</_itemId>
<_itemFields>
<itemFields>
<fieldName>Icon Name</fieldName>
<fieldValue>
<value>default_ticket.png</value>
</fieldValue>
</itemFields>
<itemFields>
<fieldName>emailCustomerUpdate</fieldName>
<fieldValue>
<value>false</value>
</fieldValue>
</itemFields>
<itemFields>
<fieldName>bestContactNumber_Customer</fieldName>
<fieldValue>
<value/>
</fieldValue>
</itemFields>
</_itemFields>
</_items>
</return>
</ns2:runSearchResponse>
</soap:Body>
</soap:Envelope>
做一个简单的:
for $x in doc("2002test.xml")
return $x
returns 我的整个文档都符合预期。
然而,任何深入研究的尝试对我来说都不起作用。
我试过:
for $x in doc("2002test.xml")/soap:Envelope/soap:Body/ns2:runSearchResponse/return
return $x/_items/itemFields/fieldName
但是长路径会抛出“没有为 'soap:Envelope' 声明的命名空间”。
所以我尝试这样声明路径:
declare variable $m := "/soap:Envelope/soap:Body/ns2:runSearchResponse/return";
for $x in doc("2002test.xml")//$m
return $x
这让我:
/soap:Envelope/soap:Body/ns2:runSearchResponse/return
/soap:Envelope/soap:Body/ns2:runSearchResponse/return
/soap:Envelope/soap:Body/ns2:runSearchResponse/return
...
我试过了:
for $x in doc("2002test.xml")/*[local-name()='soap:Envelope'][local-name()='soap:Body'][local-name()='ns2:runSearchResponse'][local-name()='return']
return $x
什么都没做。
很简单,我希望能够做这样的事情:
for $x in doc("2002test.xml")
where $x/return/_items/_itemFields/itemFields/fieldValue/value="default_ticket.png"
return $x/return/_items/_itemFields/itemFields/fieldName/text()
导致:
Icon Name
有什么建议吗?
使用带有谓词的基本 XPath 表达式,例如
doc("2002test.xml")//itemFields[fieldValue/value = "default_ticket.png"]/fieldName/text()
如果您认为需要 FLOWR 表达式,请使用例如
for $field in doc("2002test.xml")//itemFields
where $field/fieldValue/value = "default_ticket.png"
return $field/fieldName/text()