问题描述
刚刚开始使用使用 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
按预期返回我的整个文档。
然而,任何钻研它的尝试都不适合我。
我试过了:
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 表达式,例如
const MultiStrats = {
findOne: async query => "I'm a multistrat!"
};
const StrategyController = {
getMultiStrats: async () => {
const result = await MultiStrats.findOne({});
if (result) {
return result;
}
throw Error("Multistrat not found");
}
};
const calculateOrderAmount = (balance,ticker) =>
StrategyController
.getMultiStrats()
.then(multiState => {
console.log('multiState: ' + multiState);
// some logic
})
.catch(err => console.error(err))
;
calculateOrderAmount();
如果您认为需要 FLOWR 表达式,请使用例如
doc("2002test.xml")//itemFields[fieldValue/value = "default_ticket.png"]/fieldName/text()