我想先說一下,我知道有很多類似的問題(在堆疊和其他網站上)與這個問題有關,但我在過去的幾個小時里搜遍了互聯網的每一個角落,仍然一無所獲。
作為參考,我檢查了以下網站,它們提供了一些指導,但總的來說讓我比以前更困惑:
https://humanwhocodes.com/blog/2009/03/24/xpath-in-javascript-part-2/
Javascript Xpath 和默認命名空間
給我一個在KML檔案上執行xpath查詢的例子,從Javascript開始
XPath和命名空間
好吧,說到這個問題。 我正在使用Javascript和XPath來嘗試讀取一個KML檔案。 我使用 FileReader 來獲取 XML 檔案的內容,然后使用以下代碼來嘗試訪問里面的 XML 節點。
const xmlParser = new DOMParser();
const xml = xmlParser.parseFromString(contents,"text/xml"); // Contents變數包含檔案的內容(如由FileReader讀取)
// 讀取XML。
if (xml.evaluate) {
//大多數主流瀏覽器(IE除外)
var path = "/kml/Document/Folder[1]/Placemark/Point/coordinates" ;
var evaluator = new XPathEvaluator();
var resolver = evaluator.createNSResolver(xml.documentElement) 。
var nodes = xml.evaluation(path, xml.documentElement, resolver, XPathResult.ANY_TYPE, null) 。
var result = nodes.iterateNext();
while (result) {
console.log(result)。
結果 = nodes.iterateNext()。
}
我的KML檔案開頭是:
<?xml version="1.0" encoding="UTF-8"?>/span>
<kml xmlns="http://www.opengis.net/kml/2.2"/span>>
<Document>/span>
<name>-/XDF</name> /span>
從中我了解到,xmlns屬性定義了命名空間。 當我從節點中移除這個屬性時,我的Javascript代碼如期作業(因為檔案不再使用命名空間),這使我相信問題在于我沒有為XPath定義一個正確的命名空間。
resolver變數是我從上面鏈接的一個網站中復制的。 我試圖找到關于如何生成命名空間決議器的適當參考資料,但沒有找到能與我的 KML 檔案配合使用的資料。
有誰在這方面有更多的經驗,能夠為我指出正確的方向,讓我生成一個能夠讀取KML檔案的命名空間物件?
uj5u.com熱心網友回復:
感謝@dandavis的提示。
我需要創建一個單獨的函式來回傳固定的命名空間:
function resolver() {
return 'http://www.opengis.net/kml/2.2'/span>。
}
并且用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") 。
//讀取XML。
if (xml.evaluate) {
//大多數主流瀏覽器(IE除外)
var path = "//myns:Document/myns:Folder[1]/myns:Placemark/myns:Point/myns:coordinates"/span>。
var nodes = xml.evaluation(path, xml.documentElement, resolver, XPathResult.ANY_TYPE, null) 。
var result = nodes.iterateNext();
while (result) {
console.log(result)。
結果 = nodes.iterateNext()。
}
uj5u.com熱心網友回復:
使用Saxon-JS 2支持的XPath 2及以后的版本(https://www.saxonica.com/saxon-js/documentation/index.html#!api/xpathEvaluate),你可以通過為XPath評估宣告一個默認命名空間來保持你對元素的XPath路徑緊湊且無前綴
。var path = '/Document/Folder[1]/Placemark/Point/coordinates'/span>。
var result = SaxonJS.XPath.evaluate(path, xml, { xpathDefaultNamespace : 'http://www.opengis.net/kml/2.2'/span> }) 。
console.log(result)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/324034.html
標籤:
