1

xDocument とLINQ to XMLを使用して、この非常に複雑な XML ドキュメントをクエリしようとしています。次のアクションを実行したい:

特定の基準を満たすすべての要素を取得し、そうでない場合は xDocument から別の属性を返します。

例:

<cars>
    <car>
        <patrol type="oil">
            <url> http://Toyotaoil.com </url>
        </patrol>
    </car>
    <car>
        <patrol type="oil">
            <url> http://BMWoil.com </url>
        </patrol>
        <patrol type="gas">
            <url> http://BMWgas.com </url>
        </patrol>
    </car>
    <car>
        <patrol type="gas">
            <url> http://Hondagas.com </url>
        </patrol>
    </car>

ここで、このクエリから取得したいのは、車がガソリンを使用しない場合を除き、タイプがオイルのパトロールのリストです。その後、ガスで満足します。

このwhere句を使用すると、車がガスを使用するケースが見逃されます。where条件が満たされない場合にどうするかを指定できる節のようなものはありますか?

4

6 に答える 6

2
xdoc.Element("cars")
    .Elements("car")
    .Select(car => car.Elements("patrol")
                      .SingleOrDefault(p => (string)p.Attribute("type") == "oil")
                   ??
                   car.Elements("patrol")
                      .Single(p => (string)p.Attribute("type") == "gas"));
于 2010-02-13T12:56:21.600 に答える
2

以下のソリューションは、好きなようにクエリを実行できる柔軟性を提供します。

var result = from car in xdoc.Element("cars").Elements("car") 
             let patrols = car.Elements("patrol")
             let oils = patrols.Where(patrol => patrol.Attribute("type") == "oil")
             select new {
                    Car = car,
                    Patrols = (oils.Any() ? oils : patrols)
             }

私はここに Visual Studio を持っていないので、コンパイルできることを願っています :)
選択したいものについてもう少し情報を提供してください。より具体的な LINQ ステートメントを提供します。

于 2010-02-13T13:17:04.750 に答える
1

次のようなものを作ることができます:

var query = from element in someElements
            select element.Attribute("type").Value == "oil"
                ? returnSomethingWhenItIsOil
                : returnSomethingWhenItIsSomethingElse;

また

var query = from element in someElements
            where element.Attribute("type") == "oil"
                || element.Attribute("type") == "gas"
            select element;

しかし、問題をよりよく説明してください、ありがとう:)

于 2010-02-13T13:00:08.487 に答える
0

実際にはwhere句がまったく必要ないように思えます.1つの値または別の値を選択するselect句が必要なだけです。

ただし、あなたの例は、値に基づいて別のアイテムを選択する方法を実際には説明していません-どの「他の属性」を選択しますか? 「車がガスを使用する場所」とはどういう意味ですか? 例の詳細を提供できれば、一致するコードを提供するのはそれほど難しくありません。

于 2010-02-13T12:52:04.693 に答える
0
                       var cars = from c in xdoc.Descendants("car")
                       where
                       (c.Element("patrol").Attribute("type").Value == "oil" ||
                       c.Element("patrol").Attribute("type").Value == "gas")
                       select new Car
                       {
                           FuelType = c.Element("patrol").Attribute("type").Value.ToString()
                       };

    foreach (Car c in cars)
        {
            Console.WriteLine(c.ToString());
        }

    class Car
    {
        public string FuelType { get; set; }
        public override string ToString()
        {
            return "Car FeulType = " + this.FuelType.ToString();
        }
    }

これらは結果です、私は得ています

代替テキスト http://img694.imageshack.us/img694/5016/carse.jpg

于 2010-02-13T13:15:01.167 に答える
-1

Orderタイプによりご指定に応じて、お取り致しFirstOrDefault()ます。


編集:私が意味したのは次のようなものでした:

var patrols = from car in doc.Root.Elements()
              let p = car.Elements().OrderBy(patrol=>patrol.Attribute("type").Value).First()
              select p;

これは、車ごとに 1 つの結果を返します。OrderBy句を確認し、適宜調整してください。これにより、次のようになります。

<patrol type="oil">
  <url> http://Toyotaoil.com </url>
</patrol>

<patrol type="gas">
  <url> http://BMWgas.com </url>
</patrol>

<patrol type="gas">
  <url> http://Hondagas.com </url>
</patrol>

もう一度編集: ああ、クリックしました。はい、これは車ごとに 1 つのアイテムのみを返します。Zyphrax は優れたソリューションを提供してくれました。

于 2010-02-13T12:51:44.210 に答える