繁体   English   中英

使用 Javascript DOM 解析器从 WMS GetCapabilities 请求的 XML response.data 中提取层列表

[英]Using a Javascript DOM Parser extract the list of Layers from the XML response.data of an WMS GetCapabilities request

我正在尝试提取 WMS 服务器可用层的名称列表。 我通过发送 GetCapabilities 为 GeoMet WMS 完成了此操作,该 GetCapabilities 返回一个“application/xml”object,然后我使用 DOM 解析器对其进行解析。 我的问题是图层标签嵌套在两个级别上。 基本上顶层层包含多个子层。 我将如何仅提取父层的子层或列表。 我设法通过意识到子节点具有父节点没有的属性来解决这个问题,但必须有更好的方法。

编辑:我有兴趣获取可以添加到交互式 map 的层的完整列表。 基本上所有没有图层子级的图层标签。

axios.get('https://geo.weather.gc.ca/geomet?lang=en&service=WMS&version=1.3.0&request=GetCapabilities').then((response) => {
        // console.log(response.headers)
        const parser = new DOMParser()
        const dom = parser.parseFromString(response.data, 'application/xml')
        let layerGroups = dom.querySelectorAll('[cascaded="0"]')
        let layerNames = []
        layerGroups.forEach(function (domel) { layerNames.push(domel.getElementsByTagName('Name')[0].innerHTML) })
        console.log(layerNames.length)
        this.mylayerlist = layerNames
      })

有几种方法可以处理这个问题,尤其是命名空间。 这是其中之一。 在你的 dom 声明之后试试这个:

xpath = '//*[local-name()="Layer"][@cascaded="0"][not(.//*[local-name()="Layer"])]/*[local-name()="Name"]';
var targets = dom.evaluate(xpath, dom, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
let nodes = Array.from({ length: targets.snapshotLength }, (_, index) => 
console.log(targets.snapshotItem(index).innerHTML));

Output 是 3,519(在这种情况下)名称:

CGSL.ETA_ICEC
CGSL.ETA_ICEPRS
CGSL.ETA_ICESTG
CGSL.ETA_ICET
CGSL.ETA_ICETK

这里的关键组件是 xpath 表达式。 它选择具有值为0cascaded属性且没有Layer子节点的所有Layer节点。 在这种特殊情况下,具有cascaded属性的Layer节点(请注意,所有这些属性的属性值都为0 )都没有Layer子节点,因此您可以省略两个谓词之一( [@cascaded="0"][not(./*[local-name()="Layer"])]并获得相同的 output,尽管其他文件可能不是这种情况)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM