私は、Chromeが、jQueryを使用してXML($.parseXML()
)にあるfind(selector)
を使用すると私に期待している結果が得られないことがわかりました。Chromeの不正なjQuery find()のXML結果
は、以下のかなり単純化されたコード(https://jsfiddle.net/a504caa0/)考えてみましょう:IE 11またはFirefoxでこれを実行する
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.2.1.js"></script>
</head>
<body>
<script>
$(function()
{
var xml =
'<?xml version="1.0"?>' +
'<DataSet>' +
' <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">' +
' <xs:element>' +
' </xs:element>' +
' </xs:schema>' +
'</DataSet>'
;
var xmlDoc = $.parseXML(xml)
var $docElm = $(xmlDoc.documentElement);
alert("> find('xs\\:schema').length=" + $docElm.find('> xs\\:schema').length);
alert("find('xs\\:schema').length=" + $docElm.find('xs\\:schema').length);
alert("> find('xs\\:schema').find('> xs\\:element').length=" + $docElm.find('> xs\\:schema').find('> xs\\:element').length);
alert("> find('xs\\:schema').find('xs\\:element').length=" + $docElm.find('> xs\\:schema').find('xs\\:element').length);
});
</script>
</body>
</html>
を私は期待している、4つのクエリのそれぞれについて、1要素マッチを報告します。
ただし、Chrome(57.0.2987.133)のクエリでは、1 & 3が返されますが、1つの要素が返されますがクエリ2 & 4が返されます。
$xml.find('selector')
が一致を見つけていない間
$xml.find('> selector')
は、一致を見つけることです:これは、ことを意味します。言い換えれば、直接的な子供のために質問された場合、それは要素を見つけるが、子孫のために質問されれば、それはそこにないと言う!
これはXMLのみの問題か、xs\\:
名前空間を使用する必要があるかどうかはわかりません。
実生活では、XMLはますます大きくなり、直接の子どもだけでなく、子孫を問う必要があることもあります。ソリューションは、上記のクエリを変更するだけでは機能しません(find()
を1つに集約するか、children()
を使用するなど)。find()
のChromeの動作を総称して>
で動作/説明する必要があります。
EDIT:私はちょうどfind()
からすべてのXMLからxs:
とxs\\:
を取り除く試みたが、確かにそれは今クロームの下で1つの要素を返します。したがって、これはfind()
の問題のXML名前空間のようです。もちろん、私はそれを実生活で行うことはできません。 Chromeは名前空間接頭辞を持つ直接の子を見つけることができますが、一般的な子孫を含む場合は見つからないようです。許容可能な回避策はありますか?
FWIW 'xs'が唯一の名前空間である場合、' find'で指定する必要はありません。 – wOxxOm
しかし、この例のように、 ''は 'xs'ではなくデフォルトの名前空間にあることがわかります。 JSFiddleでセレクタの 'xs:\\\'を削除すると、何も見つからないことがわかります。 –
JonBrave