如何在JavaScript的XPath查询中为KML文件生成对应命名空间
你遇到的问题是XPath对默认命名空间的查询规则导致的,不需要修改原KML文件,按以下两步调整代码即可正常运行:
- 修改XPath路径,给所有节点添加自定义命名空间前缀(示例用
kml作为前缀) - 自定义命名空间解析器,将前缀映射到KML的标准命名空间URI
http://www.opengis.net/kml/2.2
修改后的完整代码如下:
const xmlParser = new DOMParser(); const xml = xmlParser.parseFromString(contents,"text/xml"); // Contents变量存储FileReader读取到的文件内容 // 读取XML if (xml.evaluate) { // 给所有节点添加kml前缀 var path = "/kml:kml/kml:Document/kml:Folder[1]/kml:Placemark/kml:Point/kml:coordinates"; // 自定义命名空间解析器,映射前缀到KML命名空间 function nsResolver(prefix) { return prefix === 'kml' ? 'http://www.opengis.net/kml/2.2' : null; } var nodes = xml.evaluate(path, xml.documentElement, nsResolver, XPathResult.ANY_TYPE, null); var result = nodes.iterateNext(); while (result) { console.log(result); result = nodes.iterateNext(); } }
补充说明
XPath规范中,文档定义的默认命名空间不会自动匹配查询路径中不带前缀的节点名,所以必须手动为路径中的节点绑定前缀,再通过解析器将前缀与对应的命名空间URI关联即可。如果你需要处理带多个命名空间的XML,只需要在nsResolver函数里补充更多前缀和URI的映射规则即可。
内容的提问来源于stack exchange,提问作者Matt Kelly
相关产品推荐
相关产品推荐

