4

次のような XML 構造があります。

[...]
<Fruits>
   <Fruit>
      <Specification>id_1001_0</Specification> 
      <Weight>23</Weight>
   </Fruit>
</Fruits>
<FruitSpecification id="id_1001_0">
   <Type>Apple</Type>
</FruitSpecification>
[...]

Linq to XML を使用して、これを (非匿名の) オブジェクトに読み込みたいと考えています。次のコードがあるとしましょう:

var fruits = from xele in xDoc.Root.Element("Fruits").Elements("Fruit")
             select new Fruit()
             {
                Weight = xele.Element("Weight").Value
             }

クエリを拡張して正しいFruitSpecificationタグを結合するにはどうすればよいですか? 目標は、これを書くことができるようになることです:

var fruits = from xele in xDoc.Root.Element("Fruits").Elements("Fruit")
             //some join?
             select new Fruit()
             {
                Weight = xele.Element("Weight").Value,
                Type = xjoinedelement.Element("Type").Value
             }

これが理解できることを願っています。この「果物」のサンプルを作成しました。実際の XML ははるかに複雑です...

4

2 に答える 2

4

はい、単純な結合でうまくいきます。

var fruits = 
    from f in xdoc.Root.Element("Fruits").Elements("Fruit")
    join fs in xdoc.Root.Elements("FruitSpecification")
         on (string)f.Element("Specification") equals (string)fs.Attribute("id")
    select new Fruit()
    {
         Weight = (int)f.Element("Weight"),
         Type = (string)fs.Element("Type")
    };

フルーツクラスの定義:

public class Fruit
{
    public int Weight { get; set; }
    public string Type { get; set; }
}
于 2013-01-30T09:59:47.510 に答える
1

これを試して:

class Fruit
{
    public int Weight { get; set; }
    public string Type { get; set; }
}

string xml = @"
            <root>
                <Fruits>
                    <Fruit>
                        <Specification>id_1001_0</Specification> 
                        <Weight>23</Weight>
                    </Fruit>
                    <Fruit>
                        <Specification>id_1002_0</Specification> 
                        <Weight>25</Weight>
                    </Fruit>
                </Fruits>
                <FruitSpecification id='id_1001_0'>
                    <Type>Apple</Type>
                </FruitSpecification>
                <FruitSpecification id='id_1002_0'>
                    <Type>Orange</Type>
                </FruitSpecification>
            </root>";
XElement element = XElement.Parse(xml);

IEnumerable<XElement> xFruites = element.Descendants("Fruit");
IEnumerable<XElement> xFruitSpecifications = element.Descendants("FruitSpecification");
IEnumerable<Fruit> frits = xFruites.Join(
    xFruitSpecifications,
    f => f.Element("Specification").Value,
    s => s.Attribute("id").Value,
    (f, s) =>
    new Fruit
        {
            Type = s.Element("Type").Value,
            Weight = int.Parse(f.Element("Weight").Value)
        });
于 2013-01-30T09:49:24.050 に答える