2015-06-05 7 views
-1

У меня есть XML, который я пытаюсь перекрыть и создать объект javascript. Каждый <roleName> будет именем объекта и содержит данные массив всех <users> внутри вJavascript loop over xml для создания массивов

Вот пример XML:.

<roles> 
    <role> 
    <roleName>Impacted User</roleName> 
    <users> 
     <user> 
     <reqUser>1234</reqUser> 
     <userFirstName>Bob</userFirstName> 
     <userLastName>Jones</userLastName> 
     <userNTID>bJones</userNTID> 
     </user> 
     <user> 
     <reqUser>5678</reqUser> 
     <userFirstName>Mike</userFirstName> 
     <userLastName>Neil</userLastName> 
     <userNTID>mneil</userNTID> 
     </user> 
    </users> 
    </role> 
    <role> 
    <roleName>Stakeholder</roleName> 
    <users> 
     <user> 
     <reqUser>5555</reqUser> 
     <userFirstName>Tim</userFirstName> 
     <userLastName>F</userLastName> 
     <userNTID>tf</userNTID> 
     </user> 
     <user> 
     <reqUser>4444</reqUser> 
     <userFirstName>Linda</userFirstName> 
     <userLastName>E</userLastName> 
     <userNTID>le</userNTID> 
     </user> 
    </users> 
    </role> 
</roles> 

Я тогда зацикливание над XML и пытаюсь создать массив объектов. В этом случае в объекте будет два массива. Один называется Ретинированные пользователей, а также другие заинтересованные стороны:

// Do we have users? 
     var tempObj = Array(), 
      temp = []; 

     // Loop over the users on this request such as impacted user or stakeholder 
     $(data).find('root>details>roles>role').each(function(x) { 

      // Define our user data 
      u = $(this); 
      role = $(u).find('roleName').text(); 

      // Loop through the roles and create an object of data 
      $(u).find('users>user').each(function(i) { 

       // Define our data for the iteration 
       r = $(this); 

       // Create our object 
       tempObj[i] = { 
        reqUser: $(r).find('reqUser').text(), 
        reqFirst: $(r).find('userFirstName').text(), 
        reqLast: $(r).find('userLastName').text(), 
        reqNTID: $(r).find('userNTID').text() 
       }; 
      }) 

      // Set our array for the specific role in iteration to the object we created 
      temp[role] = tempObj; 


     }); 

     // Debug 
     console.log(temp); 

Проблема Я бегу в том, что temp объект перезаписывается каждый раз, так что только содержит данные из последней итерации я считаю. Я пробовал делать что-то вроде temp[role][x] = tempObj;, но он сказал, что он недействителен. Он создает оба объекта правильно, но пользовательские данные переписываются каждый раз.

+0

Вопрос только в том, что XML в ваших руках? Смысл, строите ли вы этот XML самостоятельно или это результат API или что-то, что вы не можете изменить? Потому что, если вы сами его создадите, прекратите использовать XML и запустите JSON. Вы избавитесь от боли. Разбор XML - это «последнее десятилетие» :) –

+0

К сожалению, его API; Я могу работать только с тем, что у меня есть:/ – SBB

+0

Просто нажмите на массив внутри цикла. – adeneo

ответ

1

EDIT Я переписал вашу функцию:

data = "<roles><role><roleName>Impacted User</roleName><users><user><reqUser>1234</reqUser><userFirstName>Bob</userFirstName><userLastName>Jones</userLastName><userNTID>bJones</userNTID></user><user><reqUser>5678</reqUser><userFirstName>Mike</userFirstName><userLastName>Neil</userLastName><userNTID>mneil</userNTID></user></users></role><role><roleName>Stakeholder</roleName><users><user><reqUser>5555</reqUser><userFirstName>Tim</userFirstName><userLastName>F</userLastName><userNTID>tf</userNTID></user><user><reqUser>4444</reqUser><userFirstName>Linda</userFirstName><userLastName>E</userLastName><userNTID>le</userNTID></user></users></role></roles>" 
 

 
var output = {} 
 

 
// wanted output : 
 
/* 
 
{ 
 
\t "impacted users" : [{reqUser:1234 , userfirstName : Bob}] 
 
\t "Stakeholders" : [{reqUser:5555 , userfirstName : Tim}] 
 
} 
 
*/ 
 
// Loop over the users on this request such as impacted user or stakeholder 
 

 
$(data).find('role').each(function() { 
 
\t 
 
\t // Define our user data 
 
\t $role = $(this); 
 
\t role = $role.find('roleName').text(); // "Impacted users" or "Stakeholders" 
 

 
\t output[role] = []; 
 
\t 
 
\t // Loop through the roles and create an object of data 
 
\t $role.find('user').each(function() { 
 
\t \t // Define our data for the iteration 
 
\t \t $user = $(this); 
 
\t \t // Create our object 
 
\t \t output[role].push({ 
 
\t \t \t reqUser: $user.find('reqUser').text(), 
 
\t \t \t reqFirst: $user.find('userFirstName').text(), 
 
\t \t \t reqLast: $user.find('userLastName').text(), 
 
\t \t \t reqNTID: $user.find('userNTID').text() 
 
\t \t }); 
 
\t }) 
 

 
\t // Set our array for the specific role in iteration to the object we created 
 

 
}); 
 

 
// Debug 
 
console.log(output);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

Правильно, и оба объекта в массиве содержат тот же набор данных, который я пытаюсь исправить. Он создает два объекта в порядке, но пользователи должны отличаться как от держателя ставки, так и от влияющих пользователей. – SBB

+0

Хорошо, я переписал все это, я считаю, теперь это работает. Я использовал имена реальных переменных, потому что работать с «u», «i» и «r» на самом деле не так просто :) Используйте имена реальных переменных, в любом случае они будут уменьшены при минимизации. –

+0

Отлично, вы сделали это так просто :) – SBB

0

Если ваш XML является файл loadle попробовать поиграться нечто вроде этого:

var importFilename = filename; 
    var request = new XMLHttpRequest(); 
     request.open("GET", filename, false); 
     request.send(null); 
     xmlDocObj = $($.parseXML(request.responseText;)); 
     xmlDocObj.find("yourTagToFind").text(); 
0

Переместите tempObj переменную внутри loop, вместо того чтобы сделать его глобальным, чтобы получить переопределение.

// Loop over the users on this request such as impacted user or stakeholder 
$(data).find('root>details>roles>role').each(function(x) { 
// Define our user data 

var tempObj = Array(), 
u = $(this); 
role = $(u).find('roleName').text();