2009-11-14 1 views
2

У меня есть файлы xml со следующим, чтобы создать меню для нашего веб-сайта.Как использовать LINQ для преобразования xml-файла в объект

<xs:element name="Menu"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="MenuItem" type="MenuItemType" maxOccurs="unbounded"></xs:element> 
     </xs:sequence> 
     <xs:attribute name="Title" type="xs:string"></xs:attribute> 
     <xs:attribute name="Type" type="xs:string"></xs:attribute> 
    </xs:complexType> 

</xs:element> 
<xs:complexType name="MenuItemType"> 
    <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:element name="MenuItem" type="MenuItemType" /> 
    </xs:choice> 
    <xs:attribute name="Text" type="xs:string"></xs:attribute> 
    <xs:attribute name="Url" type="xs:string"></xs:attribute> 
</xs:complexType> 

Сейчас я использую XmlSerializer преобразовать эти XML-файлы, чтобы объекты меню и использовать их для создания меню. Я хочу использовать LINQ to xml для преобразования этих xml-файлов в один и тот же объект. Любая помощь будет оценена. Сгенерированный класс для вышеуказанного xml-файла:

public partial class Menu { 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("MenuItem")] 
    public MenuItemType[] MenuItem; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string Title; 
    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string Type; 
} 
public partial class MenuItemType { 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("MenuItem")] 
    public MenuItemType[] Items; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string Text; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string Url; 
} 
+0

Это было бы проще, если бы мы могли увидеть фактический XML для меню, в отличие от определения схемы для же. – Murph

+1

Почему вы хотите использовать Linq-to-XML вместо десериализации их напрямую? Удаление десериализации XML в объект кажется намного проще и предпочтительным способом сделать это .... –

+0

вот что я делаю прямо сейчас. Мне просто интересно узнать, как преобразовать рекурсивный xml в коллекцию объектов с помощью LINQ. – raj

ответ

5

Я не тестировал его. Но, надеюсь, это сработает.

var o = (from e in XDocument.Load("").Elements("MenuItem") 
     select new Menu 
     { 
      MenuItem = GenerateMenuItemType(e).ToArray(), 
      Title = (string)e.Attribute("Title"), 
      Type = (string)e.Attribute("Type") 
     }); 

private IEnumerable<MenuItemType> GenerateMenuItemType(XElement element) 
{ 
    return (from e in element.Elements("MenuItem") 
      select new MenuItemType 
      { 
       Items = GenerateMenuItemType(e).ToArray(), 
       Text = (string)e.Attribute("Title"), 
       Url = (string)e.Attribute("Url") 
      }); 
} 
+0

Мехди, спасибо большое. Было бы здорово, если бы мы могли найти решение, которое можно было бы сделать в одном запросе. – raj

+0

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