首页 > 解决方案 > 为什么 XMLDocument.evaluate 在此 WMS GetCapabilities 文档中找不到节点

问题描述

我正在尝试解析来自这个XML Document的信息。

下面的 JavaScript 适用于简单的 XML 测试文档,但我找不到可以从真实文档中返回任何节点的 XPath。

他的想法只是列出 WMS GetCapabilities XMl 文档中的所有“层”节点。

我究竟做错了什么?

谢谢,下面的代码。

<html>
<body>
  <script>
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        parser = new DOMParser();
        xmlDoc = parser.parseFromString(xhttp.responseText, "text/xml");
        var iterator = xmlDoc.evaluate('Layer', xmlDoc.documentElement, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);
        var thisNode = iterator.iterateNext();
        while (thisNode) {
          documemnt.console.log(thisNode.textContent);
          thisNode = iterator.iterateNext();
        }
      }
    };
    xhttp.open("GET", "https://geo.weather.gc.ca/geomet?service=WMS&request=GetCapabilities", true);
    xhttp.send();
  </script>
</body>

</html>

标签: javascriptxmlxpathwms

解决方案


我认为您需要学习如何考虑默认命名空间,使用evaluate函数的第三个参数将您可以自由选择的前缀映射到诸如LayerorTitle元素等元素所在的命名空间,并在 XPath 表达式中使用该前缀:

var req = new XMLHttpRequest();
req.open('GET', 'https://geo.weather.gc.ca/geomet?service=WMS&request=GetCapabilities');
req.onload = function() {
  var doc = this.responseXML;
  
  var namespaces = { wms: 'http://www.opengis.net/wms' };
  
  var result = doc.evaluate(
    '/wms:WMS_Capabilities/wms:Capability//wms:Layer/wms:Title', 
    doc, 
    function(prefix) { return namespaces[prefix]; }, 
    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, 
    null);
  
  var ol = document.createElement('ol');
  
  for (var i = 0; i < result.snapshotLength; i++) {
    var li = document.createElement('li');
    li.textContent = result.snapshotItem(i).textContent;
    ol.appendChild(li);
  }
  
  document.body.appendChild(ol);
  
};
req.send();


推荐阅读