Преобразование многоуровневого 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 в общий список. Пожалуйста, предложите. Я попробую предложенные вами решения и дам вам знать, если возникнут какие-либо другие проблемы.