【问题标题】:How can I generate a namespace for a KML file in Javascript XPath如何在 Javascript XPath 中为 KML 文件生成命名空间
【发布时间】:2021-11-13 23:31:33
【问题描述】:

首先我想说的是,我知道有很多与此问题相关的类似问题(在堆栈和其他网站上),但过去几个小时我一直在搜索互联网的每一个角落而且还在干涸。

作为参考,我查看了以下提供了一些指导的网站,但通常让我比以前更加困惑:
https://humanwhocodes.com/blog/2009/03/24/xpath-in-javascript-part-2/
Javascript Xpath and default namespaces
Give me an example of performing an xpath query on a KML document, from Javascript
XPath and Namespaces

好的,进入问题。我正在使用 Javascript 和 XPath 来尝试读取 KML 文件。我使用FileReader获取XML文件的内容,然后使用下面的代码尝试访问里面的XML节点。

const xmlParser = new DOMParser();
const xml = xmlParser.parseFromString(contents,"text/xml");  // Contents variable contains the contents of the file (as read by FileReader)

// Read XML
if (xml.evaluate) {
// Most major browsers (except IE)
    var path = "/kml/Document/Folder[1]/Placemark/Point/coordinates";

    var evaluator = new XPathEvaluator();
    var resolver = evaluator.createNSResolver(xml.documentElement);

    var nodes = xml.evaluate(path, xml.documentElement, resolver, XPathResult.ANY_TYPE, null);
    var result = nodes.iterateNext();
    while (result) {
        console.log(result);
        result = nodes.iterateNext();
    } 
}

我的 KML 文件开头为:

<?xml version="1.0" encoding="UTF-8"?>
    <kml xmlns="http://www.opengis.net/kml/2.2">
       <Document>
           <name>-/XDF</name>

据我了解,xmlns 属性定义了命名空间。当我从节点中删除此属性时(因为文件不再使用命名空间),我的 Javascript 代码按预期工作,这让我相信问题在于我没有为 XPath 定义正确的命名空间来使用。

resolver 变量是我从上面链接的站点之一复制的。我试图找到有关如何生成命名空间解析器的正确参考,但找不到适用于我的 KML 文件的内容。

在这方面有更多经验的人能指出正确的方向来生成允许我读取 KML 文件的命名空间对象吗?

【问题讨论】:

标签: javascript xml xpath namespaces kml


【解决方案1】:

感谢@dandavis 的提示。

我需要创建一个单独的函数来返回固定的命名空间:

function resolver() {
    return 'http://www.opengis.net/kml/2.2';
}

并用myns: 前缀引用我的XPath 路径到每个节点。

var path = "//myns:Document/myns:Folder[1]/myns:Placemark/myns:Point/myns:coordinates";

下面是修改后的例程(它引用了上面的resolver 函数),以防它帮助其他人:

const xmlParser = new DOMParser();
const xml = xmlParser.parseFromString(contents,"text/xml");

// Read XML
if (xml.evaluate) {
    // Most major browsers (except IE)
    var path = "//myns:Document/myns:Folder[1]/myns:Placemark/myns:Point/myns:coordinates";

    var nodes = xml.evaluate(path, xml.documentElement, resolver, XPathResult.ANY_TYPE, null);
    var result = nodes.iterateNext();
    while (result) {
        console.log(result);
        result = nodes.iterateNext();
    } 
}

【讨论】:

    【解决方案2】:

    在 Saxon-JS 2 (https://www.saxonica.com/saxon-js/documentation/index.html#!api/xpathEvaluate) 支持的 XPath 2 及更高版本中,您可以通过为 XPath 评估声明默认命名空间来保持元素的 XPath 路径紧凑且无前缀

    var path = '//Document/Folder[1]/Placemark/Point/coordinates';
    
    var result = SaxonJS.XPath.evaluate(path, xml, { xpathDefaultNamespace : 'http://www.opengis.net/kml/2.2' });
    
    console.log(result);
    

    【讨论】:

      猜你喜欢
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 2014-03-31
      • 2010-09-12
      相关资源
      最近更新 更多