12

率直な質問であるべきだと思います。簡単に説明させてください:

私のJavaScriptでは、次のようfood.xmlに読み込まれます:

getMenuXml.open("GET","food.xml",false);
getMenuXml.send();
xmlDoc=getMenuXml.responseXML;
xmlFoodList = xmlDoc.getElementsByTagName("food");

これでxmlFoodList、すべての食品要素を含む NodeList ができました。これまでのところ素晴らしい。<category>問題は、内部の要素に基づいてノードを並べ替えたいことです。私はそれを読むことができます:

xmlFoodList[i].getElementsByTagName("category")[0].childNodes[0].nodeValue

私のコードの後半では、食品がリストに表示されます。ご想像のとおり、同じカテゴリの食品を一緒にリストする必要があります。だから、私の質問は次のとおりです。カテゴリに基づいてノードを並べ替えるにはどうすればよいですか?xmlFoodList

注: 着信を変更することはできませんfood.xml。また、後でコードを編集して、リストにデータが入力されるときに並べ替えを実行したくありません。NodeList を配列に変換したくありません。後で多くのコードを書き直す必要があるからです。パフォーマンスは実際にはあまり問題にならないので、必要に応じてクローン/ネストされたループを自由に作成してください。御時間ありがとうございます。

4

3 に答える 3

16

最初に配列に変換すると、NodeList の要素を並べ替えることができます。

var foods = xmlDoc.getElementsByTagName("food");
var foodsArray = Array.prototype.slice.call(foods, 0);

sort次に、次の方法を使用できます。

foodsArray.sort(function(a,b) {
    var aCat = a.getElementsByTagName("category")[0].childNodes[0].nodeValue;
    var bCat = b.getElementsByTagName("category")[0].childNodes[0].nodeValue;
    if (aCat > bCat) return 1;
    if (aCat < bCat) return -1;
    return 0;
});

ただし、これは XML スキーマに大きく依存します。たとえば、複数のカテゴリに属する​​食品がある場合、上記のコードでは最初のカテゴリでのみ並べ替えられます。

于 2011-01-21T16:31:01.637 に答える
1

Javascriptライブラリを使用して、並べ替え、並べ替え、foreachなどのノードリスト操作で既成の関数を取得することをお勧めします。YUI-3をお勧めします。YUI -3NodeListを参照してください。

于 2011-01-21T15:09:03.733 に答える
0

これを見てください: Xml, xsl Javascript sorting . 最悪のシナリオでは、データをまったく同じ xml に変換しますが、並べ替えます。変換ペナルティを支払っている限り、次のステップが何であれ、より便利な形に変換することを検討できます.

于 2011-01-21T14:49:06.357 に答える