1

XmlReader と共に XML ファイルを使用して、クラス オブジェクトを作成しています。

これが私のクラスオブジェクトです:

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 つの新しいグループ PeerGroup と ChildGroup に置き換えます
  2. WikiGroup 内に Type 要素を追加する

しかし、WikiGroup に属性を追加し、それをクラス内の 2 つの異なるプロパティにマッピングする方法があるかどうか疑問に思いました。たとえば、次のようになります。

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

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

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

これが可能かどうかはわかりませんが、アドバイスをいただければ幸いです。

4

1 に答える 1

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; }
}

クラスでは、次のWikiMeta2 つのプロパティを追加できます。

[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);
    }
}

新しく追加されたプロパティに加えて、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>()
};
于 2013-10-24T13:27:12.140 に答える