2

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

<Capabilities>
    <Capability ID="1" Name="Capability # 1">
        <Relations>
            <Relation RelatedTo="2" RelationType="Child"/>
            <Relation RelatedTo="3" RelationType="Child"/>
            <Relation RelatedTo="4" RelationType="Child"/>
            <Relation RelatedTo="5" RelationType="Child"/>
        </Relations>
    </Capability>
    <Capability ID="3" Name="Capability # 3">
        <Relations>
            <Relation RelatedTo="1" RelationType="Dependant" />
        </Relations>
    </Capability>
    <Capability ID="2" Name="Capability # 2">
        <Relations>
            <Relation RelatedTo="6" RelationType="Child" />
            <Relation RelatedTo="5" RelationType="Child" />
        </Relations>
    </Capability>
</Capabilities>

そして、値5のRelatedTo属性を持つ子関係を持つすべての機能をクエリする必要があります。これまでに次のクエリを試しましたが、「null参照例外」のコレクションが表示され、その方法がわかりません。やれ。

   var result = root.Elements("Capability")
                 .Where(c => c.Elements("Relations")
                            .Where(r => r.Attribute("RelatedTo").Value == "5"
                                && r.Attribute("").Value == Enum.GetName(typeof(RelationTypes), RelationTypes.Children)).Any());

私が間違っていることや、それを照会する正しい方法についての手がかりはありますか?

4

2 に答える 2

4
var capabilites = root.Descendants("Capability")
            .Where(c => c.Descendants("Relation")
                         .Any(r => (string)r.Attribute("RelatedTo") == "5"))
            .ToList();
于 2012-09-11T22:02:57.447 に答える
1

これ:

var xDoc = XDocument.Parse(
@"<Capabilities>
<Capability ID=""1"" Name=""Capability # 1""> 
        <Relations> 
            <Relation RelatedTo=""2"" RelationType=""Child""/> 
            <Relation RelatedTo=""3"" RelationType=""Child""/> 
            <Relation RelatedTo=""4"" RelationType=""Child""/> 
            <Relation RelatedTo=""5"" RelationType=""Related""/> 
        </Relations> 
    </Capability> 
    <Capability ID=""3"" Name=""Capability # 3""> 
        <Relations> 
            <Relation RelatedTo=""1"" RelationType=""Dependant"" /> 
        </Relations> 
    </Capability> 
    <Capability ID=""2"" Name=""Capability # 2""> 
        <Relations> 
            <Relation RelatedTo=""6"" RelationType=""Child"" /> 
            <Relation RelatedTo=""5"" RelationType=""Child"" /> 
        </Relations> 
    </Capability> 
</Capabilities>");

var q = xDoc.Descendants("Capability").
            Where(c => c.Descendants("Relation").Where(r => (int)r.Attribute("RelatedTo") == 5).Any());

foreach (var r in q)
{
    Console.WriteLine(r);
}

結果:

<Capability ID="1" Name="Capability # 1">
  <Relations>
    <Relation RelatedTo="2" RelationType="Child" />
    <Relation RelatedTo="3" RelationType="Child" />
    <Relation RelatedTo="4" RelationType="Child" />
    <Relation RelatedTo="5" RelationType="Related" />
  </Relations>
</Capability>
<Capability ID="2" Name="Capability # 2">
  <Relations>
    <Relation RelatedTo="6" RelationType="Child" />
    <Relation RelatedTo="5" RelationType="Child" />
  </Relations>
</Capability>
Press any key to continue . . .

私はあなたが何を求めていると思いますか...

于 2012-09-11T22:12:10.063 に答える