Создать дерево на основе пути объекта - PullRequest
0 голосов
/ 20 сентября 2011

У меня есть куча объектов, они не в XML, но документ xml будет выглядеть так:

    <object>
       <path>root</path>
    </object>
    <object>
       <path>root/sub1</path>
    </object>
    <object>
       <path>root/sub1/item1</path>
    </object>
    <object>
       <path>root/sub1/item2</path>
    </object>
    <object>
       <path>root/sub2</path>
    </object>
    <object>
       <path>root/sub2/item1</path>
    </object>
    <object>
       <path>root/sub2/item2</path>
    </object>

Дерево, очевидно, очень глубокое. Есть ли у кого-нибудь алгоритм для создания этого в jstree, серии "UL" и "LI". Было бы Рождество, если бы у вас был код в VB ... но я буду удовлетворен только логикой. Моя мысль - в конечном итоге превратить это в веб-сервис jsonp, чтобы я мог использовать jstree для построения дерева, но сейчас я просто пытаюсь понять логику, необходимую для правильного анализа.

Спасибо!

1 Ответ

1 голос
/ 20 сентября 2011

Я написал некоторый код, который поможет вам превратить ваш путь в древовидную структуру.И имея такую ​​структуру, вы можете преобразовать ее во все, что вам нужно.

Отказ от ответственности: я в основном люблю C #, так что это моя первая программа на VB.NET, написанная с помощью MSDN и кода VS2008 intellisense.Тем не менее, я надеюсь, что он будет служить вашим потребностям.

Ваш текст находится в xmlString

    Private xmlString = "<root> " + _
" <object> " + _
   "<path>root</path>" + _
" </object>" + _
" <object>" + _
   "<path>root/sub1</path>" + _
" </object>" + _
" <object>" + _
   "<path>root/sub1/item1</path>" + _
" </object>" + _
" <object>" + _
   "<path>root/sub1/item2</path>" + _
" </object>" + _
" <object>" + _
   "<path>root/sub2</path>" + _
" </object>" + _
" <object>" + _
   "<path>root/sub2/item1</path>" + _
" </object>" + _
" <object>" + _
   "<path>root/sub2/item2</path>" + _
" </object>" + _
"</root>"

Здесь я создаю класс, который будет представлять древовидную структуру

   Class TreeNode
        Public NodeName As String
        Public Children As List(Of TreeNode)

        Public Sub New(ByVal ANodeName As String)
            NodeName = ANodeName
            Children = New List(Of TreeNode)

        End Sub

        Public Function AddNodeIfNotExists(ByVal ANodeName As String) As TreeNode
            For Each node As TreeNode In Children
                If node.NodeName.Equals(ANodeName) Then
                    Return node

                End If
            Next
            Dim newnode As TreeNode = New TreeNode(ANodeName)

            Children.Add(newnode)
            Return newnode

        End Function
    End Class

Инаконец, основная программа, которая создает дерево из вашего xml-кода

Sub Main()
    Dim doc As XmlDocument
    doc = New XmlDocument()
    doc.LoadXml(xmlString)
    Dim nodes As XmlNodeList
    nodes = doc.DocumentElement.GetElementsByTagName("object")

    Dim Tree As TreeNode = New TreeNode("global-root")
    Dim Slider As TreeNode = Tree

    For Each node As XmlNode In nodes
        Dim s As String = node.SelectSingleNode("path").InnerText
        Dim routes = s.Split("/")
        For Each route As String In routes
            Slider = Slider.AddNodeIfNotExists(route)

        Next
        Slider = Tree

    Next



        Console.Read()

    End Sub

Вы можете проверить свое дерево, поместив эти строки прямо перед Console.Read ()

'Test your tree
        Console.WriteLine(Tree.Children(0).NodeName = "root") 'true
        Console.WriteLine(Tree.Children(0).Children(0).NodeName = "sub1") 'true
        Console.WriteLine(Tree.Children(0).Children(0).Children(0).NodeName = "item1") 'true
        Console.WriteLine(Tree.Children(0).Children(0).Children(1).NodeName = "item2") 'true



        Console.WriteLine(Tree.Children(0).Children(1).NodeName = "sub2") 'true
        Console.WriteLine(Tree.Children(0).Children(1).Children(0).NodeName = "item1") 'true
        Console.WriteLine(Tree.Children(0).Children(1).Children(1).NodeName = "item2") 'true
...