我正在 Node.js 中使用Web服务。
在SOAP响应中,元素带有名称空间前缀,如
<common_v26_0:BookingTravelerRef Key="lGZGs8IORfCNhaHEyHf0FA=="/>
如何删除这些前缀(例如common_v26_0:
)?
答案 0 :(得分:1)
您通常不应该删除任何前缀。如果您打算从XML读取数据,则可以使用DOM API中的名称空间感知方法,或者如果您使用XPath,则可以使用注册命名空间。在XPath中,您还可以选择数据忽略命名空间。
您必须发现命名空间是什么。例如,在您的SOAP响应中,应该有一个带有xmlns:common_v26_0="your-namespace-uri"
之类的名称空间声明的属性。您需要 your-namespace-uri 从响应中选择数据:
var nsURI = "your-namespace-uri"; // replace with the actual namespace for `common_v26_0`
要选择BookingTravelerRef
,请使用具有 NS 后缀的DOM方法,例如:
var element = xmlnode.getElementsByTagNameNS(nsURI, 'BookingTravelerRef');
console.log(element.getAttribute("Key")); // unprefixed attributes belong in no namespace
如果您使用的是XPath,则可以创建一个解析名称空间的函数。 SOAP响应通常具有许多名称空间,因此您可以在同一个函数中处理所有这些名称空间。但是如果你只对一个感兴趣,你也可以内联函数:
function resolver(prefix) {
if (prefix='common_v26_0') { return "your-namespace-uri"; }
// else if ... other namespaces you might want to resolve
else return null;
}
然后你可以在XPath表达式中使用它:
xmlnode.evaluate("//common_v26_0:BookingTravelerRef/@Key", xmlnode, resolver, XPathResult.ANY_TYPE, null);
最后,您可以在XPath中忽略名称所有元素中的名称空间,然后按其本地名称进行过滤:
xmlnode.evaluate("//*[local-name()='BookingTravelerRef']/@Key", ...);