jQuery XML Parsing / Atravessando
-
06-07-2019 - |
Pergunta
Eu tenho o seguinte 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>
O que eu quero fazer é fazer um loop cada um dos de uma determinada linha.
Eu tentei fazer isso, a fim de obter todos os ids attr, mas eu também tenho os valores ids.
function fillForm(id){
var theRow = $(theXmlDoc).find('row[id='+id+']').get()
$(theRow).find("attr").each(function(i)
{
alert($(this).find("id").text());
});
}
Eu também gostaria de salientar que o objetivo principal é o loop cada attr e, posteriormente, para repetir cada valor enquanto eu tenho id do attr.
P.S se você pensar de uma maneira mais fácil / mais simples de fazê-lo com alguma outra biblioteca Estou aberto para sugestões.
Agradecemos antecipadamente,
Solução
Eu não estou claro o que você está tentando varrer, eu acho que uma das marcas na sua pergunta foi truncado. Você diz: "O que eu quero fazer é fazer um loop cada um dos de uma determinada linha." e eu acho que você tinha uma etiqueta lá.
De qualquer forma, aqui está alguns exemplos de extração de dados a partir do documento XML analisado usando jQuery. Os comentários mostram o que será alertado.
Eu acho que parte do problema é que você tem os valores ID como irmãos em vez de filhos aos atributos. Parece que uma estrutura mais coerente pode ser:
<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>
Mas se você não tem controle sobre o xml, por favor, ignore essa sugestão. : -)
Ok, aqui estão algumas amostras de travessia para obter vários pedaços de dados:
Primeiro vamos obter "Item1"
<script type="text/javascript">
// Item1
$.get('sample.xml', null, function (data, textStatus) {
alert( $(data).find('rows row[id=5] cell').text());
}, 'xml');
</script>
Agora nós vamos chegar a 1 ea 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>
E por último, vamos puxar as principais ids attr e amarrá-los para os valores:
<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>
Outras dicas
Isso deve funcionar para você
function fillForm(id){
var row = $(theXmlDoc).find('row#+'+ id);
var ids = row.find( "attr > id");
ids.each(function(i)
{
alert($(this).text());
});
}
PS. Você pode usar xpath quer:
var ids = document.evaluate( '//rows/row[@id='+id + ']/attr/id/text( )', theXmlDoc, null, XPathResult.ANY_TYPE, null );