Sudhavamsikiran Damojipurapu Ответов: 1

Преобразование многоуровневого XML в универсальный список в VB.NET


Дорогие все,

У меня есть ниже xml, который я хотел преобразовать в общий список классов.
<?xml version="1.0" encoding="utf-8"?>
<menuroot>
  <Menu id="home" text="Home">
    <subMenu id="Syllabusboard" text="Syllabusboard" url="Syllabusboard.aspx">
    
  
  <Menu id="Subjects" text="Subjects">
    <SubMenu id="SyllabusreView" text="SyllabusreView" url="SyllabusreViewReport.aspx">
    <SubMenu id="Subject " text="Subject Map" url="Subject.aspx">
    
  <Menu id="grade" text="Traceability">
    <SubMenu id="grade" text="grade Report" url=" gradeReport.aspx">
    
  
  <Menu id="testresults" text="Test results">
    <SubMenu id="testReport" text="Test Report" url="TestReport.aspx">
    
    <SubMenu id="testresultsforstudent" text="testresultsforstudent" url="testresultsforstudent.aspx">
    
  
  <Menu id="Students" text="Students">
    <SubMenu id="AttendaceLog" text="Attendace Log" url="Attendace.aspx">
    
    <SubMenu id="studentMpping" text="studentMpping" url="studentMpping.aspx">

В приведенном выше XML-файле я могу использовать атрибуты идентификатора меню и текста меню. Но не получается, как получить значения из атрибутов<подменю & gt;.

Ниже приведен код, который я пытался реализовать. Но я хочу знать более эффективный код, чем приведенный ниже. Пожалуйста, помогите мне тоже.

Dim attrAdminMenuObjects = XDocument.Parse(xmlAdminDoc.InnerXml).Descendants("Menu")
                    Dim objMenuSettings As New MenuSettings
 

                    For Each headerMenuNode In attrAdminMenuObjects.Elements
                        For Each childNode In headerMenuNode.Nodes
                            objMenuSettings .Menu_ID = headerMenuNode.FirstAttribute.Value
                           objMenuSettings .Menu_Text = headerMenuNode.LastAttribute.Value
                            Dim xeSubmenuElements As XElement = DirectCast(childNode, System.Xml.Linq.XElement)
                            If xeSubmenuElements.HasAttributes Then
                                Dim attrSubMenuElementList As IEnumerable(Of XAttribute) = From attrSubMenuelement In xeSubmenuElements.Attributes() Select attrSubMenuelement
                                For Each att In attrSubMenuElementList
                                    Select Case att.Name
                                        Case "id"
                                            objMenuSettings .SubMenu_ID = att.Value
                                        Case "text"
                                            objMenuSettings .SubMenu_Text = att.Value
                                        Case "url"
                                            objMenuSettings .URL = att.Value
                                        Case "Pagination"
                                            objMenuSettings .isPaginationRequired = att.Value
                                        Case "Filter"
                                            objMenuSettings .isFilterRequired = att.Value
                                        Case "Choose_Columns"
                                            objMenuSettings .ChooseColumns = att.Value
                                    End Select
                                    lstSiteMenuSettings.Add(objMenuSettings)
                                Next
                            End If

                        Next

                    Next


Я хотел знать, есть ли какой-нибудь эффективный способ реализовать этот сценарий. Пожалуйста, помогите мне тоже.

Что я уже пробовал:

Dim attrAdminMenuObjects = XDocument.Parse(xmlAdminDoc.InnerXml).Descendants("Menu")
                    Dim objMenuSettings As New MenuSettings
 

                    For Each headerMenuNode In attrAdminMenuObjects.Elements
                        For Each childNode In headerMenuNode.Nodes
                            objMenuSettings .Menu_ID = headerMenuNode.FirstAttribute.Value
                           objMenuSettings .Menu_Text = headerMenuNode.LastAttribute.Value
                            Dim xeSubmenuElements As XElement = DirectCast(childNode, System.Xml.Linq.XElement)
                            If xeSubmenuElements.HasAttributes Then
                                Dim attrSubMenuElementList As IEnumerable(Of XAttribute) = From attrSubMenuelement In xeSubmenuElements.Attributes() Select attrSubMenuelement
                                For Each att In attrSubMenuElementList
                                    Select Case att.Name
                                        Case "id"
                                            objMenuSettings .SubMenu_ID = att.Value
                                        Case "text"
                                            objMenuSettings .SubMenu_Text = att.Value
                                        Case "url"
                                            objMenuSettings .URL = att.Value
                                        Case "Pagination"
                                            objMenuSettings .isPaginationRequired = att.Value
                                        Case "Filter"
                                            objMenuSettings .isFilterRequired = att.Value
                                        Case "Choose_Columns"
                                            objMenuSettings .ChooseColumns = att.Value
                                    End Select
                                    lstSiteMenuSettings.Add(objMenuSettings)
                                Next
                            End If

                        Next

                    Next

Maciej Los

"Я хочу знать более эффективный код, чем приведенный ниже- это вовсе не вопрос!

Sudhavamsikiran Damojipurapu

Мой вопрос прост...Я хотел бы знать, есть ли какой-либо эффективный способ реализовать этот сценарий

[no name]

Да, профилируйте свой код и прекратите использовать LINQ.

Sudhavamsikiran Damojipurapu

Спасибо за ответ. Позвольте мне узнать немного больше ясности по этому поводу.

[no name]

Конечно. Профилируйте свой код и прекратите использовать LINQ.

Sudhavamsikiran Damojipurapu

Привет Масиэль Лос,

Большое вам спасибо за предоставленную информацию. Я согласен, что мой английский очень плох и мне не хватает ясности в моем вопросе. Пожалуйста, подумайте. Мой вопрос заключается в том, есть ли какой-либо другой способ, которым я могу преобразовать приведенный выше XML в общий список. Пожалуйста, предложите. Я попробую предложенные вами решения и дам вам знать, если возникнут какие-либо другие проблемы.

1 Ответов

Рейтинг:
1

Maciej Los

Как я уже упоминал в комментарии к этому вопросу, ваш вопрос неясен...

В данный момент я могу сказать только:
Лучший способ "преобразовать" xml-данные в список классов - это использовать сериализация[^]. Видеть:
Сериализация и десериализация XML: Часть 1[^]
Сериализация и десериализация XML: Часть 2[^]
Полный образец сериализации и десериализации пользовательских коллекций классов[^]
Примеры XML-сериализации[^]