2011-08-16 31 views
6

Estoy tratando de agarrar un nodo xml por su atributo.¿Hay alguna forma de obtener XML de elemento por atributo?

edición

Estoy tratando de recuperar un elemento por su valor de atributo usando javascript XML en lugar de jQuery. ¿Hay un método simple para esto?

+6

no hacen eso. Es grosero. Intenta hablarle al elemento antes de agarrarlo por su atributo. En serio, ¿puedes dar más detalles sobre tu pregunta? ¿Qué intentaste y cuáles fueron los resultados? –

+0

que estoy tratando de conseguir un elemento usando javascript en lugar de jquery.find ("nodo [id = '1']") – Wenn

+0

Por favor, no anteponer sus títulos con "javascript:". Para eso son las etiquetas. –

Respuesta

2

Tienes que encontrar una lista de elementos primero, luego filtrar por sus atributos.

Salida mi demo aquí: http://jsfiddle.net/silkster/eDP5V/

+0

Eso es lo que hice ... Solo quería ver si hay otra manera más simple. – Wenn

+0

@ Wenn, gracias por la votación! – Silkster

1

Siento que esto justifica una nueva respuesta, ya que es jQuery gratuito

document.getElementsByAttribute = function(attribute, value, tagName, parentElement) { 
    var children = ($(parentElement) || document.body).getElementsByTagName((tagName || '*')); 
    return $A(children).inject([], function(elements, child) { 
     var attributeValue = child.getAttribute(attribute); 
     if(attributeValue != null) { 
      if(!value || attributeValue == value) { 
       elements.push(child); 
      } 
     } 
     return elements; 
    }); 
} 

source


se ha señalado a mí que me envió el guión equivocado .. jeje leer here

// document.getElementsByAttribute([string attributeName],[string attributeValue],[boolean isCommaHyphenOrSpaceSeparatedList:false]) 
document.getElementsByAttribute=function(attrN,attrV,multi){ 
    attrV=attrV.replace(/\|/g,'\\|').replace(/\[/g,'\\[').replace(/\(/g,'\\(').replace(/\+/g,'\\+').replace(/\./g,'\\.').replace(/\*/g,'\\*').replace(/\?/g,'\\?').replace(/\//g,'\\/'); 
    var 
     multi=typeof multi!='undefined'? 
      multi: 
      false, 
     cIterate=document.getElementsByTagName('*'), 
     aResponse=[], 
     attr, 
     re=new RegExp(multi?'\\b'+attrV+'\\b':'^'+attrV+'$'), 
     i=0, 
     elm; 
    while((elm=cIterate.item(i++))){ 
     attr=elm.getAttributeNode(attrN); 
     if(attr && 
      attr.specified && 
      re.test(attr.value) 
     ) 
      aResponse.push(elm); 
    } 
    return aResponse; 
} 
+0

¿estás seguro de que esta es una respuesta libre de jquery? '$ (parentElement)' ...? – Brian

+0

¡Ups! Estaba viendo dos en los mismos foros ... http://www.codingforums.com/showthread.php?t=26744 Probé ambos ... parece que funciona para mí. – rlemon

+1

Así que no es exactamente jQuery libre, pero jQuery Lite segura - no hay extensiones/plugins/módulos ... – Brian

1

es muy fácil usando jQuery. Supongamos que tenemos una cadena como esta.

<document> 
    <value type="people"> 
     <name> 
     John 
     </name> 
    </value> 
    <value type="vehicle"> 
     <name> 
     Ford 
     </name> 
    </value> 
</document> 

Entonces

var xmlDocument = $.parseXML(str); 
$(xmlDocument).find("value[type='people'] name").text() 

Obtendremos cadena de nuevo 'John'.

Cuestiones relacionadas