Tengo un código básico que puede recorrer cierto XML generado a partir de Adobe RoboHelp (para nuestra documentación de ayuda). Esto funciona bien, pero dado que un tema puede anidarse tantas veces como lo desee el escritor, necesito una forma mejor de recorrer este XML en lugar de simplemente anidar los bucles .each()
.Looping a través de XML con jQuery
Esto es lo que el XML se parece
<?xml version="1.0" encoding="utf-8"?>
<!--RoboML: Table of Content-->
<roboml_toc>
<page title="Welcome" url="Welcome.htm"/>
<book title="Getting Started" url="Getting_Started/Initial_Setup.htm">
<page title="Initial Setup" url="Getting_Started/Initial_Setup.htm"/>
<page title="Customize Settings" url="Getting_Started/Settings.htm"/>
</book>
<book title="Administrator Services" url="Administrator_Services/General_Administrator.htm">
<book title="Portal Workspace" url="Administrator_Services/Portal_Workspace/AdminHome.htm">
<page title="Home" url="Administrator_Services/Portal_Workspace/AdminHome.htm"/>
<page title="Portal Accounts" url="Administrator_Services/Portal_Workspace/Portal_Accounts.htm"/>
</book>
<book title="SpamLab" url="Administrator_Services/SpamLab/SpamLab_Admin_General.htm">
<page title="Alerts" url="Administrator_Services/SpamLab/Alerts.htm"/>
<page title="Spam Quarantine" url="Administrator_Services/SpamLab/Admin_Spam_Quarantine_.htm"/>
</book>
</book>
<book title="User Services" url="User_Services/General_User.htm">
<book title="Portal Workspace" url="User_Services/Portal_Workspace/Home.htm">
<page title="Home" url="User_Services/Portal_Workspace/Home.htm"/>
<page title="Self Help" url="User_Services/Portal_Workspace/Self_Help.htm"/>
</book>
<book title="SpamLab" url="User_Services/SpamLab/SpamLab_General.htm">
<page title="Spam Quarantine" url="User_Services/SpamLab/Spam_Quarantine.htm"/>
<page title="Virus Quarantine" url="User_Services/SpamLab/Virus_Quarantine.htm"/>
</book>
<book title="Encryption" url="User_Services/Encryption/Encryption_General.htm">
<page title="Outlook Plug-in" url="User_Services/Encryption/Encryption_Outlook_Plug_in.htm"/>
</book>
</book>
</roboml_toc>
Un <page>
es un artículo, y una <book>
es una carpeta.
Su es mi código de jQuery, que sólo puede buscar un nivel de profundidad de etiquetas
//Get the TOC
$tocOutput="";
$.get(tocURL,function(toc){
$(toc).children().each(function(){
$tocOutput+="<li><a href='"+$(this).attr("url")+"'>"+$(this).attr("title")+"</a>";
if(this.tagName=="BOOK"){
$tocOutput+="<ul>";
$(this).find("page").each(function(){
$tocOutput+="<li><a href='"+$(this).attr("url")+"'>"+$(this).attr("title")+"</a></li>";
});
$tocOutput+="</ul>";
}
$tocOutput+="</li>";
});
$("#list").html($tocOutput);
Sé que hay una mejor forma de bucle sólo a través de todos los elementos y luego determinar si el elemento tiene hijos, etc., pero me simplemente no puedo pensar en cómo hacerlo.
¡Cualquier ayuda es muy apreciada!
Simplemente curioso: ¿por qué debe hacerse esto en el cliente? ¿Por qué no aplicar una transformación XSLT en el servidor y enviar el html? ¿El xml es dinámico? ¿Podría el html transformado no almacenarse en caché en el servidor? –
En cualquier caso, me alegro de que hayas encontrado una solución - AHORA ACEPTA LA RESPUESTA DE KEITH :) –
¡NEGúSelo! Esto fue solo una prueba de concepto por el momento ... en realidad solo quería impresionar a algunas personas. Me están lloviendo elogios ahora, así que vale la pena. Eventualmente creo que estaremos haciendo este lado del servidor sin embargo. –