0

私は次のXMLを持っています

<Group>
    <Id>2</Id>
    <GroupName>Fizzy Drinks</GroupName>
    <DateCreated>0001-01-01T00:00:00</DateCreated>
    <DateModified>0001-01-01T00:00:00</DateModified>
    <Person>
      <PersonId>78</PersonId>
      <PersonName>Francesca</PersonName>
      <PersonSurname>Andrews</PersonSurname>
      <PersonAge>59</PersonAge>
    </Person>
    <Products>
      <ProductId>2</ProductId>
      <ProductName>Oranges</ProductName>
      <CategoryId>4</CategoryId>
      <CategoryName></CategoryName>
      <SubCategoryId>7</SubCategoryId>
      <SubCategoryName>Bread</SubCategoryName>
    </Products>
    <Products>
      <ProductId>12</ProductId>
      <ProductName>Pepsi</ProductName>
      <CategoryId>4</CategoryId>
      <CategoryName></CategoryName>
      <SubCategoryId>8</SubCategoryId>
      <SubCategoryName>Dairy</SubCategoryName>
    </Products>
    <Products>
      <ProductId>14</ProductId>
      <ProductName>Multiwheat Bread</ProductName>
      <CategoryId>4</CategoryId>
      <CategoryName></CategoryName>
      <SubCategoryId>7</SubCategoryId>
      <SubCategoryName>Bread</SubCategoryName>
    </Products>
</Group>

そして、Group オブジェクト内で以下を取得したいと考えています。

私は次のコードを持っています:-

            foreach (XElement xe in xdoc.Descendants("Group"))
        {
            int id = Convert.ToInt32(xe.Element("Id").Value);

            var group = from g in xdoc.Descendants("Group")
                        where (int)g.Element("Id") == id // filtering groups here
                        select new Group
                        {
                            Id = (int)g.Element("Id"),
                            GroupName = (string)g.Element("GroupName"),
                            DateCreated = (DateTime)g.Element("DateCreated"),
                            DateModified = (DateTime)g.Element("DateModified"),
                            Person = from d in g.Descendants("Person")
                                     select new Person
                                         {
                                             Id = (int)d.Element("PersonId"),
                                             Name = (string)d.Element("PersonName"),
                                             Surname = (string)d.Element("PersonSurname"),
                                             Age = (int)d.Element("PersonAge"),
                                         },

                            PersonId = (int)g.Element("PersonId"),
                            PersonName = (string)g.Element("PersonName"),
                            PersonSurname = (string)g.Element("PersonSurname"),
                            PersonAge = (int)g.Element("PersonAge"),
                            Products = g.Elements("Products")
                                .Select(p => new Product
                                {
                                    Id = (int)p.Element("ProductId"),
                                    ProductName = (string)p.Element("ProductName")
                                }).ToList()
                        };

            foreach (var g in group)
            {
                GroupList.Add(g);
            }

        }

ただし、 Person は IEnumerable ではないため、エラーが発生します。ただし、グループごとに 1 人しかいないため、IEnumerable にしたくありません。これを回避する方法はありますか?

あなたの助けと時間をありがとう

4

2 に答える 2

0

あなたができるように聞こえます:

Person = (from d in g.Elements("Person")
          select new Person
          {
              Id = (int)d.Element("PersonId"),
              Name = (string)d.Element("PersonName"),
              Surname = (string)d.Element("PersonSurname"),
              Age = (int)d.Element("PersonAge"),
          }).First()

しかし、次のように書く方が良いでしょう:

Person = Person.FromXElement(g.Element("Person"))

whereは次のようなFromXElement静的メソッドです。Person

public static Person FromXElement(XElement element)
{
    return new Person
    {
        Id = (int) element.Element("PersonId"),
        Name = (string) element.Element("PersonName"),
        Surname = (string) element.Element("PersonSurname"),
        Age = (int) element.Element("PersonAge")
    };
}

そうすれば、クエリがより明確になります。

于 2013-03-15T11:54:19.100 に答える
0

<Person>要素を保持し、後で使用する新しい範囲変数を宣言する方が良い

var group = from g in xdoc.Descendants("Group")
            let person = g.Element("Person") // here
            where (int)g.Element("Id") == id
            select new Group {
               ...
            }

そしてそれを使用します:

 Person = new Person {
            Id = (int)person.Element("PersonId"),
            Name = (string)person.Element("PersonName"),
            Surname = (string)person.Element("PersonSurname"),
            Age = (int)person.Element("PersonAge")
          },

nullxml に person 要素がない可能性があるかどうかのチェックを追加することもできます。

 Person = (person == null) ? null : 
           new Person {
              Id = (int)person.Element("PersonId"),
              Name = (string)person.Element("PersonName"),
              Surname = (string)person.Element("PersonSurname"),
              Age = (int)person.Element("PersonAge")
           },
于 2013-03-15T11:53:28.380 に答える