1

私は次のxml構造を持っています

<userlist>
  <user Name="something">
    <function name="funcname">
      <picture name="pictname">
         <curve name="curvename">
          <name>NAME</name>
          ...
         </curve>
      </picture>
     </function>
     <function name="function2">
     ...
     </function>
   </user>

もう少し続きます。「関数」タグを抽出し、これを簡略化するコードを使用してオブジェクトに配置する関数を作成しました。

from function in xmlDoc.Descendants("function")
select new FUNCTIONOBJECT {
 do all the rest...
 }.toList<FUNCTIONOBJECT>();

特定のユーザーの機能のみをフィルタリングするようにしようとしています。そのため、ユーザーの name 属性が与えられます。LINQでこれを機能させる方法を誰か教えてもらえますか? 私の試みは:

from user in xmlDoc.Descendants("user")
where user.Attribute("Name").Value == givenusername
select {
   var functions =
     from function in user.Descendants("function")
     select new FUNCTIONOBJECT {
     ... more stuff
     }.toList<FUNCTIONOBJECT>();

しかし、これは間違っていてうまくいきません。すべてのヘルプは良いです。私はC#にかなり慣れていませんが、LINQを使用したxml解析に頭を悩ませようとしています。

編集:私が持っているものの更新されたバージョンであり、まだ機能しません:

XDocument xmlDoc = XDocument.Load(path);

        var functionlist =
            (from user in xmlDoc.Descendants("user")
             where user.Attribute("Name").Value == username
             select(
             (from function in user.Descendants("function")
             select new Function
             {
                 name = function.Attribute("name").Value,
                 pictures =
                    (from picture in function.Descendants("picture")
                     select new Picture
                     {
                         name = picture.Attribute("name").Value,
                         layout = picture.Element("layout").Value,
                         curves =
                            (from curve in picture.Descendants("curve")
                             select new Curve
                             {
                                 name = curve.Attribute("name").Value,
                                 section = curve.Element("section").Value,
                                 run = curve.Element("run").Value,
                                 folder = curve.Element("folder").Value,
                                 drivingpoint = curve.Element("drivingpoint").Value,
                                 display = int.Parse(curve.Element("display").Value),
                                 points =
                                    (from point in curve.Descendants("point")
                                     select new Point
                                     {
                                         id = point.Element("id").Value != null ? point.Element("id").Value : string.Empty,
                                         direction = point.Element("direction").Value != null ? point.Element("direction").Value : string.Empty,
                                     }).ToList<Point>(),
                             }).ToList<Curve>(),
                     }).ToList<Picture>(),
             }).ToList<Function>(),
             ).toList();
    }
4

1 に答える 1

4

ほんの少しの構文ミス。そうでなければ、内容は正しかった。C# と LINQ の構文を同時に学習するのは少し難しいです (言語の中の言語)。修正されたコードは次のとおりです。

from user in xmlDoc.Descendants("user")
where user.Attribute("Name").Value == givenusername
select ((from function in user.Descendants("function")  // When you do a "select something" "something" must have a value, so you can't begin with "{ var functions = ..."
         select new FUNCTIONOBJECT 
         {
             // more stuff
         }).ToList();  // You don't have to specify <FUNCTIONOBJECT> because the compiler deduce it from the context (here there a new FUNCTIONOBJECT

しかし、ここでは、List<List<FUNCTIONOBJECT>>. なんで?1 人のユーザーだけがgivenusername.

その場合は、コードを分割してください。

// Gets the user
var user = (from user in xmlDoc.Descendants("user")
            where user.Attribute("Name").Value == givenusername
            select user).Single();  // Get the only user that satisfy the condition (Throw an exception if no user has the given name or if multiple users have the given name)

// Gets its functions
List<FUNCTIONOBJECT> functions = (from function in user.Descendants("function")
                                  select new FUNCTIONOBJECT 
                                  {
                                      // more stuff
                                  }).ToList();  
于 2013-01-29T15:46:52.917 に答える