Я пытаюсь использовать XPath и XML, как указано в MDN: Введение в использование XPath в JavaScript. Однако, когда я попытался использовать XML как есть, это привело к ошибке (см. Ниже)
const xmlStr = `<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:n0="http://tempuri.org/">
<soapenv:Header>
</soapenv:Header>
<soapenv:Body>
<n0:SavePartnerDetailsWithToken xmlns:n2="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<n0:userToken></n0:userToken>
<n2:myNode>valueHere</n2:myNode>
</n0:SavePartnerDetailsWithToken>
</soapenv:Body>
</soapenv:Envelope>`;
const xmlObj = new DOMParser().parseFromString(xmlStr, 'application/xml');
const nsResolver = xmlObj.createNSResolver(xmlObj.ownerDocument === null ? xmlObj.documentElement : xmlObj.ownerDocument.documentElement);
firstNode = xmlObj.evaluate('/soapenv:Envelope/soapenv:Body/n0:SavePartnerDetailsWithToken/n2:myNode', xmlObj, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
console.log(firstNode.singleNodeValue.textContent)
Затем я переместил все атрибуты xmlns: в root, поскольку метод createNSResolver () ожидает documentElement в качестве параметра.
const xmlStr = `<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:n0="http://tempuri.org/"
xmlns:n2="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<soapenv:Header>
</soapenv:Header>
<soapenv:Body>
<n0:SavePartnerDetailsWithToken>
<n0:userToken></n0:userToken>
<n2:myNode>valueHere</n2:myNode>
</n0:SavePartnerDetailsWithToken>
</soapenv:Body>
</soapenv:Envelope>`;
const xmlObj = new DOMParser().parseFromString(xmlStr, 'application/xml');
const nsResolver = xmlObj.createNSResolver(xmlObj.ownerDocument === null ? xmlObj.documentElement : xmlObj.ownerDocument.documentElement);
firstNode = xmlObj.evaluate('/soapenv:Envelope/soapenv:Body/n0:SavePartnerDetailsWithToken/n2:myNode', xmlObj, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
console.log(firstNode.singleNodeValue.textContent)
Это работает. Однако я не могу гарантировать, что объявления пространства имен находятся в элементе root для XML, который загружен в мое приложение во время выполнения. Я хотел бы знать, можно ли
- XPathNSResolver создать таким образом, чтобы учитывались объявления пространства имен в root, а также все дочерние элементы. ИЛИ
- Объявления xmlns: можно поднять на root.
Также приветствуются альтернативные решения!