2009-11-14 66 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文件轉換爲Menu對象並使用它們來生成菜單。我想使用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 2009-11-14 12:20:20

+1

爲什麼要使用Linq-to-XML而不是直接反序列化它們?將XML反序列化爲對象看起來好像是更容易和更好的方式來做到這一點.... – 2009-11-14 13:11:15

+0

這就是我現在正在做的事情。我只是有興趣知道如何將遞歸XML轉換爲使用LINQ的對象集合。 – raj 2009-11-14 14:43:07

回答

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

Mehdi,非常感謝。如果我們能夠找到可以在單個查詢中執行的解決方案,那將是非常好的。 – raj 2009-11-14 14:51:08

+0

問題在於你的Xml文檔結構。第一個孩子與他們的孩子有不同的結構。如果您可以更改Xml文檔結構併爲所有菜單項創建新的永久架構,那麼將其寫入查詢非常容易。 – 2009-11-14 19:13:27