Использование E4X для поиска различных значений в списке XML - PullRequest
0 голосов
/ 14 декабря 2011

Рассмотрим этот фрагмент XML:

 <book id="5" />
 <book id="15" />
 <book id="5" />
 <book id="25" />
 <book id="35" />
 <book id="5" />

Как составить оператор / запрос E4X, чтобы получить список уникальных значений в атрибуте id?Я использую E4X в не-браузерном контексте JavaScript.

5
15
25
35

Существует ли какой-либо метод distinct() или groupby(), который бы помог?Если нет, то как это можно сделать?

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Не существует уникального или группового метода. Однако E4X позволяет вам быстро создать XMLList значений неуникальных значений.

var xmlSnippet = <stuff><book id="5"/>
                        <book id="15"/>
                        <book id="5"/>
                        <book id="25"/>
                        <book id="35"/>
                        <book id="5"/>
                  </stuff>;
var attributes = xmlSnippet['book'].attribute("id");

Чтобы сделать его уникальным, вы можете взять XMLList, выполнить итерацию по нему и сохранить каждый элемент как значение ключа в объекте.

var uniqueAttributes = new Object ();

for each (var a in attributes)
{
    uniqueAttributes[a] = null;
}

Чтобы получить доступ к этим значениям, выполните итерацию по ним, используя цикл for (а не a для каждого входа)

for (var u in uniqueAttributes)
{
// do something with u
}
1 голос
/ 14 декабря 2011

Предполагается, что значения атрибутов, о которых идет речь, не содержат символа «|».Если это так, то измените символ канала в самом низу на что-то еще, кроме значенийПеременные статически типизированы для выполнения JIT.Надеюсь, что это делает то, что вам нужно.

var idvalues = function (x) { //x = node name
    var a = document.getElementsByTagName(x),
        b,
        c = [],
        d,
        e;
    for (b = a.length - 1; b > -1; b -= 1) { // gather all the id values into an array
        c.push(a[b].getAttribute("id"));
    }
    for (b = c.length - 1; b > -1; b -= 1) {
        if (c[b] !== "") {
            for (d = b - 1; d > -1; d -=1) {
                if (c[b] === c[d]) {
                    c[d] = "";
                }
            }
        }
    }
    e = c.join("|");
    c = e.split("|");
    return c;
};
...