2009-06-04 82 views
2

我有一個的XElement變量命名內容它由以下的XML:手動將XElement解析爲自定義對象的最佳方式是什麼?

<content> 
    <title>Contact Data</title> 
    <p>This is a paragraph this will be displayed in front of the first form.</p> 
    <form idCode="contactData" query="limit 10; category=internal"/> 
    <form idCode="contactDataDetail" query="limit 10; category=internal"> 
     <title>Contact Data Detail</title> 
     <description>This is the detail information</description> 
    </form> 
</content> 

我現在想簡單通過每個1級節點的運行,並將其解析爲對象。回到C#2.0中,我使用XmlReader來檢查節點的類型,並相應地解析它。

但是,什麼是解析與LINQ的XML節點的最佳方式,我希望這樣的事情:

var contentItems = from contentItem in pageItem.content.DescendantNodes() 
        select new ContentItem 
        { 
         Type = contentItem.Element() 
        }; 

foreach (var contentItem in contentItems) 
{ 
    switch (contentItem.Type) 
    { 
     case "title": 
      ...(parse title)... 
     case "p": 
      ...(parse p)... 
     case "form": 
      ...(parse form)... 
    } 
} 

其中:

public class ContentItem 
{ 
    public string Type { get; set; } 
    public string IdCode { get; set; } 
    public XElement Content { get; set; } 
} 
+0

你究竟在哪裏解析?例如,當您解析標題時...您想在哪裏輸入值「聯繫數據」? – jrista 2009-06-04 09:54:42

+0

當我解析標題節點時,「Contact Data」將作爲TextBlock添加到UserControl中。當我解析表單節點時,那麼一個idCode =「contactData」的表單將從數據庫中加載並顯示出來,等等。 – 2009-06-04 10:27:26

回答

2

是否必須是XElement?我會(手動,或通過XSD.EXE)剛剛創建映射到元素/屬性名稱類 - 並使用XmlSerializer - 通過StringReader特別是:

 Content content; 
     using(StringReader sr = new StringReader(xml)) 
     using(XmlReader xr = XmlReader.Create(sr)) { 
      XmlSerializer ser = new XmlSerializer(typeof(Content)); 
      content = (Content)ser.Deserialize(xr); 
     } 

(編輯)

隨着實體類:

[XmlRoot("content")] 
public class Content { 
    [XmlElement("title")] 
    public string Title { get; set; } 
    [XmlElement("p")] 
    public string Description { get; set; } 
    [XmlElement("form")] 
    public List<ContentForm> Forms { get; set; } 
}  
public class ContentForm { 
    [XmlAttribute("idCode")] 
    public string Id { get; set; } 
    [XmlAttribute("query")] 
    public string Query { get; set; } 
    [XmlElement("title")] 
    public string Title { get; set; } 
    [XmlElement("description")] 
    public string Description { get; set; } 
} 
0

使用XML到LINQ,可以將特定數據項從XML中提取出來,而不是遍歷XML查找所發現的內容。

var results = from node in XmlDocument.SomeContext(...) 
       select new MyType { 
       Prop1 = node.Element("One").Value, 
       Prop2 = node.Element("One").Attributes().Where(
         a => A.Value.Contains("Foo").Value 
      }; 

如果需要的條件,則(擴展)方法和任意表達式都可以使用(空合併運算符,??,可以是默認非常有用)。

1

我建議繼承XElement,並實現你想要的東西的屬性。 這些屬性不應使用支持字段,而應直接與底層XML元素一起使用。這樣,你會保持對象與XML同步。

相關問題