【问题标题】:Javascript Xpath and default namespacesJavascript Xpath 和默认命名空间
【发布时间】:2012-03-08 17:02:51
【问题描述】:

我有一些 JavaScript/Xpath 无法正常工作。 (available on 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!");
    }

...但如果我专门针对具有 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!");
    }

我做错了什么?

【问题讨论】:

  • 您能否拆分您的问题以仅显示问题?作为一个简短且(无效)的示例?
  • @powtac - 尝试过......但代码实际上只创建了一个 XML 文档,然后对其进行 2 次查询。这真的只是一个测试用例。

标签: javascript xpath xml-namespaces


【解决方案1】:

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

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

    return function (prefix) {
       return nsResolver.lookupNamespaceURI(prefix) || defaultNamespace;
    };
} (xmlDoc.documentElement));

您还必须像这样选择元素:

"child::default:myElement"
// where 'default' can be anything, as long as there is a namespace

进一步阅读:

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

【讨论】:

  • 最终 XPath 并不是最好的解决方案……但这似乎可行。
猜你喜欢
  • 2013-06-23
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2010-09-05
  • 2014-09-17
  • 2011-10-09
相关资源
最近更新 更多