Javascript Xpath和默认名称空间

Ric*_*uen 5 javascript xpath xml-namespaces

我有一些JavaScript/Xpath,它没有像我期望的那样工作.(在jsfiddle上可用)似乎我在使用XML命名空间时出错了,阻止我通过节点(标记)名称查询我的元素.

如果我尝试查询当前节点的所有子节点,我发现该元素myElement没有问题:

    var xpathResult = xmlDoc.evaluate( "child::*", rootElement, nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
    var queryEl;
    if(queryEl = xpathResult.iterateNext()) {
        alert("child::* found element " + queryEl.nodeName);
    }
    else {
        alert("child::* found nothing!");
    }
Run Code Online (Sandbox Code Playgroud)

...但是如果我专门针对具有myElement节点(标记)名称的节点,我得不到任何结果:

    /* Now try getting only those children with nodeName `myElement` */
   xpathResult = xmlDoc.evaluate( "child::myElement", rootElement, nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
    var queryEl;
    if(queryEl = xpathResult.iterateNext()) {
        alert("child::myElement found element " + queryEl.nodeName);
    }
    else {
        alert("child::myElement found nothing!");
    }
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Yos*_*shi 6

试试这个作为你的解析器:

var nsResolver = (function (element) {
    var
      nsResolver = element.ownerDocument.createNSResolver(element),
      defaultNamespace = element.getAttribute('xmlns');

    return function (prefix) {
       return nsResolver.lookupNamespaceURI(prefix) || defaultNamespace;
    };
} (xmlDoc.documentElement));
Run Code Online (Sandbox Code Playgroud)

您还必须选择以下元素:

"child::default:myElement"
// where 'default' can be anything, as long as there is a namespace
Run Code Online (Sandbox Code Playgroud)

进一步阅读:

你的小提琴:http://jsfiddle.net/chKZc/5/ (更新)