2012-03-08 8 views
3

JavaScript/Xpathは期待したとおりに動作しません。 (available on jsfiddle)XML名前空間に何か問題があり、ノード(タグ)名で要素をクエリできなくなっているようです。私は現在のノードのすべての子ノードを照会しようとした場合Javascript Xpathとデフォルトネームスペース

は、私は問題なく要素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ノード(タグ)名を持つノードをターゲット場合I結果が得られません:

/* 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!"); 
    } 

私は間違っていますか?

+0

あなただけの問題を表示することができ、問題を分割していただけますか?短いと(の)有効な例として? – powtac

+0

@powtac - 試してみましたが、実際にはXML文書を作成してから2つのクエリを作成します。それは本当に単なるテストケースです。 –

答えて

4

あなたのリゾルバとしてこれを試してみてください:

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/を更新)

+0

最後に、XPathは最適なソリューションではありませんでしたが、これはうまくいくようです。 –

関連する問題