2009-06-20 4 views
16

У меня есть следующие XML-JQuery XML Синтаксический/обходе

<rows> 
    <row id="5"> 
     <cell>Item1</cell> 
    <attrs> 
    <attr> 
     <id>1</id> 
     <type>CheckBox</type> 
     <values> 
     <value> 
      <id>10</id> 
     </value> 
     <value> 
      <id>11</id> 
     </value> 
     </values> 
    </attr> 
    <attr> 
     <id>2</id> 
     <type>CheckBox</type> 
     <values> 
     <value> 
      <id>20</id> 
     </value> 
     <value> 
      <id>21</id> 
     </value> 
     </values> 
    </attr> 
    </attrs> 
    </row> 
</rows> 

То, что я хочу сделать это в цикле каждый из определенного ряда.

Я попытался сделать это, чтобы получить все идентификаторы attr, но также получил значения id.

function fillForm(id){ 
    var theRow = $(theXmlDoc).find('row[id='+id+']').get() 

    $(theRow).find("attr").each(function(i) 
    { 
     alert($(this).find("id").text()); 
    }); 
} 

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

P.S Если вы думаете о более легком/более простом способе сделать это с какой-либо другой библиотекой, я открыт для предложений.

Спасибо заранее,

+0

Был просто почти такой же вопрос. +1 –

ответ

14

Я не ясно, что вы пытаетесь перебрать, я думаю, что один из тегов в вопросе был искажен. Вы говорите: «Я хочу сделать петлю каждую из определенной строки». и я думаю, что у вас там есть бирка.

В любом случае, вот несколько примеров извлечения данных из проанализированного XML-документа с использованием jQuery. Комментарии показывают, что будет предупреждено.

Я думаю, что часть проблемы заключается в том, что у вас есть значения id как родственные, а не дочерние атрибуты. Похоже, что более последовательная структура может быть:

<rows> 
    <row id="5"> 
     <cell>Item1</cell> 
     <attrs> 
      <attr id="1"> 
       <type>CheckBox</type> 
       <values> 
        <value> 
         <id>10</id> 
        </value> 
        <value> 
         <id>11</id> 
        </value> 
       </values> 
      </attr> 
      <attr id="2"> 
       <type>CheckBox</type> 
       <values> 
        <value> 
         <id>20</id> 
        </value> 
        <value> 
         <id>21</id> 
        </value> 
       </values> 
      </attr> 
     </attrs> 
    </row> 
</rows> 

Но если вы не имеете контроля над XML, пожалуйста, игнорировать это предложение. :-)

Хорошо, вот некоторые образцы обходе, чтобы получить различные части данных:

Во-первых, давайте просто получить «ITEM1»

<script type="text/javascript"> 
// Item1 
$.get('sample.xml', null, function (data, textStatus) { 
    alert($(data).find('rows row[id=5] cell').text()); 
}, 'xml'); 
</script> 

Теперь мы получим 1 и 2 :

<script type="text/javascript"> 
// 1 
// 2 
$.get('sample.xml', null, function (data, textStatus) { 
    $(data).find('rows row[id=5] attrs attr > id').each(function(){ 
      alert($(this).text()); // 1, 2 
    }); 
}, 'xml'); 
</script> 

и, наконец, давай вытащить основной атр идентификаторов и связать их в значение:

<script type="text/javascript"> 
// rows row[id=5] attrs attr > id 1 has inner ids of 10,11 
// rows row[id=5] attrs attr > id 2 has inner ids of 20,21 
$.get('sample.xml', null, function (data, textStatus) { 

     var out = '' 
     $(data).find('rows row[id=5] attrs attr > id').each(function(){ 
       out += 'rows row[id=5] attrs attr > id ' + $(this).text(); 
       var innerIds = []; 
       $(this).siblings('values').find('value id').each(function(){ 
        innerIds.push($(this).text()) 
       }); 
       out += ' has inner Ids of ' + innerIds.join(',') + '\n'; 
     }); 
     alert(out); 
    }, 'xml'); 
</script> 
+0

В основном то, что я хочу перебрать, это attrs, и для каждого attr мне нужно получить каждое из его значений, и в дополнение к fetch attr id я не могу изменить xml, поэтому мне нужно решение для этого. Я попробую ваш код завтра, когда у меня будет рабочая станция, спасибо. –

1

Это должно работать для вас

function fillForm(id){ 
    var row = $(theXmlDoc).find('row#+'+ id); 
    var ids = row.find("attr > id"); 

    ids.each(function(i) 
    { 
     alert($(this).text()); 
    }); 
} 

PS. Вы можете использовать xpath либо:

var ids = document.evaluate('//rows/row[@id='+id + ']/attr/id/text()', theXmlDoc, null, XPathResult.ANY_TYPE, null); 
+0

Не работает. –

+0

Отредактировано. Извините, я не могу проверить это здесь. –