2010-10-07 3 views
0

J'ai une structure de données existante qui est stockée en tant que doc xml. C'est essentiellement un sitemap. Chaque nœud a des métadonnées associées (par exemple, mots-clés et description associés au nœud). J'aimerais pouvoir utiliser le plugin xml_data pour pouvoir charger directement à partir de cette source. D'un coup d'œil à la fois à la documentation et à la source, cela ne semble pas possible - je me limite aux deux formats décrits dans la documentation.JsTree: charger des métadonnées personnalisées à partir d'une source xml externe

Cependant, je ne peux pas imaginer que ce soit un cas d'utilisation complètement unique. Il semble que mes options seraient d'étendre jstree afin que je puisse ajouter mon propre XSLT à la var xsl pour gérer mon format, pré-traiter le format du côté serveur de fichiers afin que le résultat soit dans le format attendu, ou changer mon échange de données Formatage en JSON et conversion entre JSON et XML côté serveur. Le sentiment que j'ai reçu des messages que j'ai vus est qu'il est au moins possible de sérialiser/désérialiser les métadonnées avec le plugin json_data, mais je n'en suis pas sûr à 100%. Est-ce que quelqu'un peut aider à affiner ma direction en fonction de votre expérience?

Répondre

4

Je pense que c'est possible.

Voir:

http://www.jstree.com/documentation/xml_data

La fonction JsTree appelée .parse_xml peut être utilisé pour convertir des chaînes XML ou objets à la structure DOM requise par jstree.

Editer: Mauvais!

Si vous postez un exemple de votre carte de site XML je serais heureux de créer un exemple de travail pour vous.

Edit: Exemple de travail ci-dessous

Vous pouvez faire un processus JsTree source XML externe, mais via le ajax options. Imaginez que vous ayez un fichier XBEL comme ceci:

<xbel version="1.0">  
    <bookmark href="http://stackoverflow.com"> 
     <title>Stack Overflow</title> 
    </bookmark> 
    <folder> 
     <title>Stack Exchange</title> 
     <folder> 
      <title>Programming</title> 
      <bookmark href="http://stackoverflow.com"> 
       <title>Stack Overflow</title> 
      </bookmark> 
      <bookmark href="http://stackapps.com"> 
       <title>Stack Apps</title> 
      </bookmark> 
      <bookmark href="http://webapps.stackexchange.com"> 
       <title>Web Applications</title> 
      </bookmark> 
      <bookmark href="http://programmers.stackexchange.com/"> 
       <title>Programmers</title> 
      </bookmark> 
     </folder> 
     <folder> 
      <title>Systems</title> 
      <bookmark href="http://serverfault.com"> 
       <title>Server Fault</title> 
      </bookmark> 
      <bookmark href="http://superuser.com"> 
       <title>Super User</title> 
      </bookmark> 
     </folder> 
     <bookmark href="http://careers.stackoverflow.com"> 
      <title>Careers</title> 
     </bookmark> 
     <bookmark href="http://meta.stackoverflow.com"> 
      <title>Meta</title> 
     </bookmark> 
     <bookmark href="http://area51.stackexchange.com"> 
      <title>Area 51</title> 
     </bookmark> 
     <bookmark href="http://gaming.stackexchange.com"> 
      <title>Gaming</title> 
     </bookmark> 
    </folder> 
</xbel> 

Vous pouvez traiter cela avec JsTree comme ceci:

<html> 
    <head> 
     <title></title> 
     <script type="text/javascript" src="_lib/jquery.js"></script> 
     <script type="text/javascript" src="_lib/jquery.cookie.js"></script> 
     <script type="text/javascript" src="_lib/jquery.hotkeys.js"></script> 
     <script type="text/javascript" src="jquery.jstree.js"></script> 
     <script type="text/javascript"> 

      $(function() { 
       $("#xbel").jstree({ 
        "xml_data" : { 
         "ajax" : { 
          "url" : "stackexchange.xml", 
          "success" : function(data, textStatus, XMLHttpRequest){ 
           var result = $('<dom></dom>'); 
           var root = $('<root></root>');   
           var doc = traverseXbel($(data), root); 
           result.append(doc); 
           return result.html(); 
          } 
         }, 
         "xsl" : "nest" 
        }, 
        "plugins" : [ "themes", "xml_data" ] 
       }); 

      }); 

      function traverseXbel(xbel, doc){ 
       var title, href, item, name, content, innerdoc; 
       // folder => item 
       // bookmark => item with href attribute 

       // Deal with this level bookmarks     
       $(xbel).children('bookmark').each(function(){ 
        href = $(this).attr('href'); 
        title = $(this).find('title').text(); 
        if(title && href){ 
         item = $('<item></item>'); 
         content = $('<content></content>'); 
         name = $('<name></name>'); 
         name.attr("href", href);       
         name.text(title);       
         content.append(name); 
         item.append(content);       
         doc.append(item); 
        } 
       });     
       $(xbel).children('folder').each(function(){ 
        title = $(this).find('title:first').text(); 
        if(title){ 
         item = $('<item></item>'); 
         content = $('<content></content>'); 
         name = $('<name></name>'); 
         name.text(title);       
         content.append(name); 
         item.append(content);       
         item = traverseXbel($(this), item); 
         doc.append(item);        
        } 
       });     
       return doc; 
      } 


     </script> 
    </head> 
    <body> 
     <div id="xbel"></div> 
    </body> 
</html> 

D'accord, je me sens moins d'un idiot maintenant, ma première réponse était erronée parce que je mal compris la Documents de l'API JsTree.

0

J'ai eu exactement la même exigence que vous où mon XML source n'a pas suivi l'un des « formats » décrits dans jsTree. La façon dont j'ai résolu ce problème consistait à écrire un script XSLT pour transformer mon XML en un format accepté par jsTree, puis à charger de manière asynchrone le fichier XML résultant.

+0

Pourriez-vous s'il vous plaît poste votre code .. au moins un échantillon de s'il vous plaît? – Interstellar

Questions connexes