2013-10-24 39 views
1

我正在使用XML文件以及XmlReader來填充類對象。使用屬性來使用XmlReader對數據進行分段

這裏是我的類對象:

public class WikiMeta 
{ 
    string _subject; 

    public List<WikiArticle> Articles = new List<WikiArticle>(); 

    public List<WikiGroup> Groups = new List<WikiGroup>(); 

    public string PageMetaDescription { get; set; } 

    public string PageTitle { get; set; } 

    public string Route { get; set; } 

    public string Subject { get; set; } 
} 

這裏是XML的一個樣本:

<AllMeta> 
    <WikiMeta> 
    <Subject>The Subject</Subject> 
    <PageTitle>Page title</PageTitle> 
    <PageMetaDescription>Page meta description</PageMetaDescription> 
    <Articles> 
     <WikiArticle> 
     <FileName>file.txt</FileName> 
     </WikiArticle> 
    </Articles> 
    <Groups> 
     <WikiGroup> 
     <Name>Main group</Name> 
     </WikiGroup> 
     <WikiGroup> 
     <Name>Secondary group</Name> 
     </WikiGroup> 
    </Groups> 
    </WikiMeta> 
</AllMeta> 

使用XmlReader類,在XML自動映射到我的類屬性,但是,我現在想介紹物品類型的變化。我的2個顯而易見的解決方案是:

  1. 更換WikiGroup 2個新組等組和ChildGroup
  2. 添加類型元素中WikiGroup

不過,我想知道是否有添加的一種方式屬性WikiGroup並將其映射到在我的課兩種不同的性質,這樣的事情:

WikiGroup attr="peer"> 
     <Name>Main group</Name> 
     </WikiGroup> 

[XmlAttribute("peer")] 
public WikiGroup PeerGroup { get; set; } 

[XmlAttribute("child")] 
public WikiGroup ChildGroup { get; set; } 

我不知道這是可以或不可以,但禾任何意見非常感謝。

回答

0

讓我們假設你想有:

<Groups> 
    <WikiGroup type="peer"> 
    <Name>Main group</Name> 
    </WikiGroup> 
    <WikiGroup type="child"> 
    <Name>Secondary group</Name> 
    </WikiGroup> 
</Groups> 

您應該Type屬性添加到您的WikiGroup類,因爲你已經說過:

public partial class WikiGroup 
{ 
    public string Name { get; set; } 
    [System.Xml.Serialization.XmlAttributeAttribute("type")] 
    public string Type { get; set; } 
} 

WikiMeta類,您可以添加2屬性:

[XmlIgnore] 
public WikiGroup PeerGroup 
{ 
    get 
    { 
     return groupsField.FirstOrDefault(g => g.Type== "peer"); 
    } 
    set 
    { 
     if (groupsField == null) 
      groupsField = new List<WikiGroup>(); 
     var peerGroup = groupsField.FirstOrDefault(g => g.Type == "peer"); 
     if (peerGroup != null) 
      groupsField.Remove(peerGroup); 
     value.Type = "peer"; 
     groupsField.Add(value); 
    } 
} 

[XmlIgnore] 
public WikiGroup ChildGroup 
{ 
    get 
    { 
     return groupsField.FirstOrDefault(g => g.Type == "child"); 
    } 
    set 
    { 
     if (groupsField == null) 
      groupsField = new List<WikiGroup>(); 
     var childGroup = groupsField.FirstOrDefault(g => g.Type == "child"); 
     if (childGroup != null) 
      groupsField.Remove(childGroup); 
     value.Type = "child"; 
     groupsField.Add(value); 
    } 
} 

除了n ewly添加的屬性,你必須採取Groups二傳手的護理:

private List<WikiGroup> groupsField; 

public List<WikiGroup> Groups 
{ 
    get 
    { 
     return this.groupsField; 
    } 
    set 
    { 
     if (value.FirstOrDefault(g => g.Type == "peer") == null && PeerGroup != null) 
      value.Add(PeerGroup); 
     if (value.FirstOrDefault(g => g.Type == "child") == null && ChildGroup != null) 
      value.Add(ChildGroup); 
     this.groupsField = value; 
    } 
} 

這是爲了防止價值觀的首要在類似於下面的對象創建工作要做:

WikiMeta o = new WikiMeta() 
{ 
    PeerGroup = new WikiGroup() { Name = "Test Peer" }, 
    ChildGroup = new WikiGroup() { Name = "Test Child" }, 
    Groups = new List<WikiGroup>() 
}; 
相關問題