使用长的、多特殊字符、路径名查询 XML 数据

问题描述

刚刚开始使用使用 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()