0

適切なコードを書いたり質問したりするのは間違っているかもしれませんが、次のことについて助けを求めています。

次のように、多対多の関係を持つxmlファイルがあります。

<ShowRoom>
  <Cars>
    <Car id="1" number="001" name="MyCar" >
      <Parts>
        <Part id="1" />
        <Part id="2" />
      </Parts>
    </Car>
    <Car id="2" number="002" name="YourCar" >
      <Parts>
        <Part id="2" />
        <Part id="3" />
        <Part id="4" />
      </Parts>
    </Car>
  </Cars>
  <Parts>
    <Part id="1" name="Tyre" active="true"/>
    <Part id="2" name="Window" active="true"/>
  </Parts>
</ShowRoom>

そのオブジェクトに対応するのは次のとおりです

public class Car
{
    private int _id;
    public int Id
    {
        get { return _id; }
        set { _id = value; }
    }

    private string _number;
    public string Number
    {
        get { return _number; }
        set { _number = value; }
    }

    private string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    private List<Parts> _listParts;
    public List<Parts> ListParts
    {
        get { return _listParts; }
        set { _listParts = value; }
    }
}

私がしようとしているのは、xml を読み取って車と部品を結合することです。そのため、すべての部品の詳細を含む車のオブジェクトを取得します。

  IEnumerable<XElement> xCar = xdoc.Element("ShowRoom").Element("Cars").Elements("Car");
                IEnumerable<XElement> xPart = xdoc.Element("ShowRoom").Element("Parts").Elements("Part");
                IEnumerable<Car> car = xCar.Join(
                    xPart,
                    c => c.Element("Parts").Element("Part").Attribute("id").Value,
                    p => p.Attribute("id").Value,
                    (c, p) =>
                    new Cars
                    {
                        Id = int.Parse(c.Attribute("id").Value),
                        Number = (string)c.Attribute("number").Value,
                        Name = (string)c.Attribute("name").Value,

                        ListParts =  
                        { 
                                new Parts
                                    {
                                        Id = int.Parse(p.Attribute("id").Value),
                                        Name = (string)p.Attribute("name").Value,
                                        Active = bool.Parse(p.Attribute("active").Value)
                                    }
                        }
                    });

ここでの問題は、明らかに間違っている上記のコードのように、車に対してすべての部品を取得する方法がわからないことです

                        ListParts =  
                        { 
                                new Parts
                                    {
                                        Id = int.Parse(p.Attribute("id").Value),
                                        Name = (string)p.Attribute("name").Value,
                                        Active = bool.Parse(p.Attribute("active").Value)
                                    }

上記の同じコードを使用してそれを行う方法、または他の良い方法がある場合は、私と共有してください。

ありがとう。

4

1 に答える 1

2

部品の辞書を作成してから、車のリストを作成することを強くお勧めします

Dictionary<int, Part> partsById = doc.Root
    .Element("Parts")
    .Elements("Part")
    .Select(p => new Parts
            {
                Id = (int) p.Attribute("id"),
                Name = (string) p.Attribute("name"),
                Active = (bool) p.Attribute("active")
            })
    .ToDictionary(part => part.Id);

各オブジェクトは単一の部分のみを表すため、名前を に変更Partsしたことに注意してください。また、 の明示的な変換を使用して、すべての解析を削除しました。PartXAttribute

次に、車のリストを作成するときに、次を使用できます。

...
ListParts = c.Element("Parts")
             .Elements("Part")
             .Select(p => partsById[(int) p.Attribute("Id")])
             .ToList();

Carまた、自動的に実装されたプロパティを調べる必要があります。これにより、クラスがわずか数行のコードに削減されます。

public class Car
{
    public int Id { get; set; }
    public string Number { get; set; }
    public string Name { get; set; }
    public List<Parts> ListParts { get; set; }
}
于 2013-03-28T15:16:36.290 に答える