JsTree: загрузка пользовательских метаданных из внешнего источника XML - PullRequest
0 голосов
/ 08 октября 2010

У меня есть существующая структура данных, которая хранится в виде XML-документа. По сути, это карта сайта. Каждый узел имеет некоторые связанные метаданные (например, ключевые слова и описание, связанное с узлом). Я хотел бы иметь возможность использовать плагин xml_data для загрузки непосредственно из этого источника. Если взглянуть как на документацию, так и на источник, то это не кажется возможным - я ограничен двумя форматами, описанными в документации.

Однако я не могу себе представить, что это совершенно уникальный случай использования. Кажется, у меня есть варианты расширить jstree, чтобы я мог добавить свой собственный XSLT в переменную xsl для обработки моего формата, предварительно обработать формат на стороне файлового сервера, чтобы результат был в ожидаемом формате, или изменить обмен данными отформатировать в JSON и конвертировать между JSON и XML на стороне сервера. Смысл, который я получаю из постов, которые я видел, заключается в том, что по крайней мере возможно сериализовать / десериализовать метаданные с помощью плагина json_data, но я не уверен на 100% в этом.

Может кто-нибудь помочь уточнить мое направление на основе вашего опыта?

Ответы [ 3 ]

4 голосов
/ 08 октября 2010

Мне кажется, что это возможно.

См .:

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

Функция JsTree с именем .parse_xml может использоваться для преобразования строк или объектов XML в структуру DOM, требуемую jstree.

Редактировать: Неверно!

Если вы опубликуете пример XML карты вашего сайта, я был бы рад создать для вас рабочий пример.

Редактировать: Рабочий пример ниже

Вы можете заставить JsTree обрабатывать внешний источник XML, но с помощью параметров ajax .Представьте, что у вас есть файл XBEL, подобный этому:

<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>

Вы можете обработать это с JsTree следующим образом:

<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>

Хорошо, теперь я чувствую себя менее идиотом, мой первый ответ был невернымпотому что я неправильно понял документацию по JsTree API.

0 голосов
/ 13 октября 2011

У меня было точно такое же требование, как и у вас, когда мой исходный XML не соответствовал ни одному из «форматов», описанных в jsTree. Я решил эту проблему, написав скрипт XSLT для преобразования моего XML в формат, который принимает jsTree, и затем асинхронно загружая полученный XML-файл.

0 голосов
/ 18 ноября 2010

Может пригодиться следующий jsTree с пользовательским примером XML: JSTree и пользовательский XML

...