XPath 出错.节点不能在创建节点的文档以外的文档中使用

Error with XPath. Node cannot be used in a document other than the one in which it was created

本文关键字:文档 节点 出错 创建 XPath 不能      更新时间:2023-09-26

我正在尝试使用XPath解析xml文档。

该脚本在 chrome 上运行良好,但给了我以下错误:

错误

文档错误:节点不能在文档以外的文档中使用 创建它的一个

有问题的代码如下:

function StringToXML(oString) {
    //code for IE
    if (window.ActiveXObject) {
        var oXML = new ActiveXObject("Microsoft.XMLDOM"); oXML.loadXML(oString);
        return oXML;
    }
    // code for Chrome, Safari, Firefox, Opera, etc.
    else {
        return (new DOMParser()).parseFromString(oString, "text/xml");
    }
}
function parseGpx(xmlText){
    var pointArray = new Array();
    var $xml = StringToXML(xmlText);
    var path = "//*[local-name()='trkpt']";
    var paragraphCount = document.evaluate(path, $xml, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
    //this last line is what is causing the problems.

我想知道可能是什么问题,这是我的控制台.logs的结果:

console.log(xmlText):

<?xml version="1.0" encoding="iso-8859-1"?>
<gpx version="1.0" creator="http://www.bikecityguide.org"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.topografix.com/GPX/1/0"
    xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
    <name></name>
    <desc></desc>
    <time>2013-10-10T17:54:09Z</time>
    <bounds minlat="47.068677710511" minlon="15.423460100401" maxlat="47.074318908518" maxlon="15.431141947021"/>
    <trk>
        <trkseg>
            <trkpt lon= "15.429682825318" lat="47.074318908518" />
            <trkpt lon= "15.428824518436" lat="47.071922203043" />
            <trkpt lon= "15.424404237975" lat="47.071366853467" />
            <trkpt lon= "15.423460100401" lat="47.068677710511" />
            <trkpt lon= "15.427107904664" lat="47.068970015231" />
            <trkpt lon= "15.428781603085" lat="47.070957644813" />
            <trkpt lon= "15.430755708927" lat="47.071016103385" />
            <trkpt lon= "15.430326555481" lat="47.072068346707" />
            <trkpt lon= "15.431141947021" lat="47.072068346707" />
            <trkpt lon= "15.430884454953" lat="47.074114315917" />
        </trkseg>
    </trk>
<wpt lon="15.429682825318" lat="47.074318908518"></wpt>
<wpt lon="15.428824518436" lat="47.071922203043"></wpt>
<wpt lon="15.424404237975" lat="47.071366853467"></wpt>
<wpt lon="15.423460100401" lat="47.068677710511"></wpt>
<wpt lon="15.427107904664" lat="47.068970015231"></wpt>
<wpt lon="15.428781603085" lat="47.070957644813"></wpt>
<wpt lon="15.430755708927" lat="47.071016103385"></wpt>
<wpt lon="15.430326555481" lat="47.072068346707"></wpt>
<wpt lon="15.431141947021" lat="47.072068346707"></wpt>
<wpt lon="15.430884454953" lat="47.074114315917"></wpt>
</gpx>

控制台.log($xml):

URL
    "http://localhost/trackeditor/"
activeElement
    gpx
async
    true
baseURI
    "http://localhost/trackeditor/"
characterSet
    "UTF-8"
childNodes
    NodeList[gpx]
compatMode
    "CSS1Compat"
contentType
    "text/xml"
currentScript
    null
defaultView
    null
dir
    ""
doctype
    null
documentElement
    gpx
documentURI
    "http://localhost/trackeditor/"
firstChild
    gpx
hidden
    true
implementation
    DOMImplementation { hasFeature=hasFeature(), createDocumentType=createDocumentType(), createDocument=createDocument(), more...}
inputEncoding
    "UTF-8"
lastChild
    gpx
lastModified
    "10/16/2013 13:15:31"
lastStyleSheetSet
    null
localName
    null
location
    null
mozFullScreen
    false
mozFullScreenElement
    null
mozFullScreenEnabled
    false
mozHidden
    true
mozPointerLockElement
    null
mozVisibilityState
    "hidden"
namespaceURI
    null
nextSibling
    null
nodeName
    "#document"
nodeType
    9
nodeValue
    null
ownerDocument
    null
parentElement
    null
parentNode
    null
preferredStyleSheetSet
    ""
prefix
    null
previousSibling
    null
readyState
    "complete"
referrer
    ""
selectedStyleSheetSet
    ""
styleSheetSets
    Object { length=0, item=item(), contains=contains()}
styleSheets
    Object { length=0, item=item()}
textContent
    null
title
    ""
visibilityState
    "hidden"
__proto__
    XMLDocumentPrototype { ELEMENT_NODE=1, ATTRIBUTE_NODE=2, TEXT_NODE=3, more...}

我想知道为什么会发生这种情况,几乎所有谷歌搜索这个问题的结果都是与 TinyMCE 相关的,不是很有帮助。

取而代之的是:

var paragraphCount = document.evaluate(path, $xml, null,
                         XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );

您应该使用:

var paragraphCount = $xml.evaluate(path, $xml, null, 
                         XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );

更简单的跨浏览器方式,

而不是

var paragraphCount = document.evaluate(path, $xml, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ); 

使用所有者文档

var paragraphCount =  $xml.ownerDocument.evaluate(path, $xml, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );