Использование E4X для поиска различных значений в списке XML

Рассмотрим этот фрагмент 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(), который мог бы помочь? Если нет, то как это можно сделать?


person p.campbell    schedule 14.12.2011    source источник


Ответы (2)


Не существует уникального или группового метода. Однако 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 in (а ​​не a для каждого in)

for (var u in uniqueAttributes)
{
// do something with u
}
person csj    schedule 14.12.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;
};
person austincheney    schedule 14.12.2011