具有自定义xml或json结构的JsTree

时间:2018-11-07 14:12:54

标签: javascript json xml jstree jstree-search

我有一个看起来像这样的XML结构:

<RootFeature>
<Name>MainFeature</Name>
<Subfeatures>
    <Feature>
        <Name>Feature1</Name>
        <Subfeatures>
            <Feature>
                <Name>Feature1_1</Name>
        </Feature>
            <Feature>
                <Name>Feature1_2</Name>
        </Feature>
            <Feature>
                <Name>Feature1_3</Name>
        </Feature>
        </Subfeatures>
    </Feature>
    <Feature>
        <Name>Feature2</Name>
    </Feature>
    <Feature>
        <Name>Feature3</Name>
        </Feature>
    <Feature>
        <Name>Feature4</Name>
        </Feature>
    <Feature>
        <Name>Feature5</Name>
    </Feature>
    <Feature>
        <Name>Feature6</Name>
    </Feature>
    <Feature>
        <Name>Feature7</Name>
    </Feature>
</Subfeatures>

我想在其上使用Jstree并创建一棵树。我尝试将Jstree直接应用于XML(XML),并且得到与该主题相同的结果:

Populating jstree from xml string

将其转换为Json后(使用以下库:https://goessner.net/download/prj/jsonxml/),我有了:

 "RootFeature":{
"Name":"Feature1",
"Subfeatures":{"Feature":[
{
  "Name":"Feature1",
  "Subfeatures":{"Feature":[
    {"Name":"Feature1_1"},
    {"Name":"Feature1_2"},
    {"Name":"Feature1_3"}
    ]}
},
{"Name":"Feature2"},
{"Name":"Feature3"},
{"Name":"Feature4"}, 
{"Name":"Feature5"},
{"Name":"Feature6"},
{"Name":"Feature7"}
]}

我搜索了如何在我的结构上应用Jstree,因为我知道必须遵循某种格式,其中<Name>标签必须用<text>替换,<Subfeatures><children>替换,并删除<Feature>标签。

我在论坛上找到了这个主题:JsTree with custom json data 但是无法应用该解决方案。而且说实话,我完全不理解它。

我什至尝试使用Json数据来递归地重新创建树,但是我无法创建具有多个具有相同名称“ text”的元素的“ Children”数组,每个元素都有一个值(最终像一个Json文件) )。要么是:

"Children":
"text1":"Feature1",
"text2":"Feature2",
"text3":"Feature3",

"Children":
"0":"Feature1",
"1":"Feature2",
"2":"Feature3",

如果有人知道我如何使用我的结构与Jstree打交道,或者有任何想法,欢迎您。

谢谢

1 个答案:

答案 0 :(得分:0)

jsTree希望使用特定格式的数据来创建树。您的结构需要解析为类似于here所述的JSON结构。将XML转换为JSON后,您可以在其上使用以下解析器。

function getFeature(s, t) {
    t.text = s["Name"] ? s["Name"] : "";
    if (s.hasOwnProperty("Subfeatures")) {
        t.children = []; 
        s.Subfeatures.Feature.forEach(function (f, i) {
            t.children.push({})
            getFeature(f, t.children[i]);
        });
    }
}

function ParseData() {
    //Convert XML to JSON prior to this.

    var oSourceJSON = {
        "RootFeature": {
            "Name": "Feature1",
         ...
         ...
         ...

    };

    var result = [];
    if (oSourceJSON.hasOwnProperty("RootFeature")) {
        result.push({});
        getFeature(oSourceJSON.RootFeature, result[0]);
    }
    return result;
}

$(document).ready(function () {
    $('#jstree_demo_div').jstree({
        core: {
            //Note: If you use an external service use a callback method here
            data: ParseData()
        }
    });
});