2012-10-23 1 views
2

J'ai un fichier XML qui contient des instructions de traitement sous la forme <?myinst contents ?>. J'ai besoin de tous les avoir dans une collection, avec une seule requête DOM, si possible. Est-ce possible sans avoir l'itération sur tout l'arbre?Est-il possible d'obtenir tous les éléments d'instruction de traitement à partir du DOM

+0

Qu'est-ce que vous utilisez pour l'analyse XML? –

+0

@PeterAronZentai J'utilise [xmldom] (https://github.com/jindw/xmldom). – Mario

Répondre

2

Vous devez parcourir sur l'arbre avec xml-dom. L'implémentation que vous avez pointée utilise réellement l'itération complète même pour le getElementByID, ou pour d'autres méthodes de sélection. De meilleures implémentations utiliseraient tagName et id caches ... Si votre objectif est d'assurer une compatibilité complète (browser et nodejs), vous n'avez simplement pas d'autres options qu'un filtre basé sur la récursivité, quelque chose comme ça.

function _visitNode(node,callback){ 
    if(callback(node)){ 
     return true; 
    } 
    if(node = node.firstChild){ 
     do{ 
      if(_visitNode(node,callback)){return true} 
     }while(node=node.nextSibling) 
    } 
} 

function getPIs(rootNode){ 
    var ls = []; 
    _visitNode(rootNode, function(node){ 
    if(node !== rootNode && node.nodeType == 7) { 
     ls.push(node); 
     return true; 
    } 
    }); 
    return ls; 
} 

Nous utilisons libxmljs et xslt pour sélectionner les choses, mais seulement pour IPs il pourrait être un surpuissant ... HTH

+0

Bon code, merci pour cela. En parlant de cela, connaissez-vous une meilleure implémentation DOM que xmldom? J'ai beaucoup cherché et j'ai fini par choisir celui-là car c'était celui qui semblait le moins mauvais. – Mario

+0

une secousse désolé de la tête, au moins en ce qui concerne nodejs. cela nous a causé un mal de tête aussi, donc fini avec une solution xml/xslt. libxmljs utilise la bibliothèque libxml et est performant. mais utiliser cela limitera votre solution nodejs à linux (Windows ne supporte pas node-waf, seulement node-gyp, et la libxmljs est toujours la plus ancienne basée sur node-waf). De plus, vous perdez des points communs. –

+0

Merci pour les conseils. Salutations. – Mario

Questions connexes