XML查询 - 检索值

时间:2014-01-12 06:31:36

标签: c# xml linq-to-xml

令我非常沮丧的是,我花了半天的时间为XML文档构建了一些查询,在开始之前我不知道比我知道的更多。所以,我正在采取简单的方法,再次请求帮助。

XML代码是这样的:

<?xml version="1.0" ?>
<Main>
<alpha Id = "AlphaId_1">
    <beta>AlphaId1_Beta</beta>
    <gamma>AlphaId1_Gama</gamma>
    <delta Type = "A">AlphaId1_DeltaTypeA</delta>
    <delta Type = "B">AlphaId1_DeltaTypeB</delta>
    <kapa Id="01">
        <description>AlphaId1_KapaId1_Descr</description>
        <name>AlphaId1KapaId1_Name</name>
        <teta>AlphaId1KapaId1_Teta</teta>
    </kapa>
    <kapa Id="02">
        <description>AlphaId1KapaId2_Descr</description>
        <name>AlphaId1KapaId2_Name</name>
        <teta>AlhaId1KapaId2_Teta</teta>
    </kapa>
</alpha>
<alpha Id = "AlphaId_2">
    <beta>AlphaId2_Beta</beta>
    <gamma>AlphaId2_Gama</gamma>
    <delta Type = "A">AlphaId2_DeltaTypeA</delta>
    <delta Type = "B">AlphaId2_DeltaTypeB</delta>
    <kapa Id="01">
        <description>AlphaId2_KapaId1_Descr</description>
        <name>AlphaId2KapaId2_Name</name>
        <teta>AlphaId2KapaId2_Teta</teta>
    </kapa>
    <kapa Id="02">
        <description>AlphaId1KapaId2_Descr</description>
        <name>AlphaId2KapaId2_Name</name>
        <teta>AlhaId2KapaId2_Teta</teta>
    </kapa>
</alpha>
</Main>

我正在寻找一个查询来检索例如值“AlphaId2_DeltaTypeA”。 第二个查询应检索所选AlphaId的每个KapaId的所有描述值。

我能想到的唯一代码是

XDocument xdoc = XDocument.Load(@"doc.xml");

IEnumerable<XElement> list1 = xdoc.Root.Descendants("delta");

  var cifmi = 
    from el in list1 
    where   (string)el.Attribute("Type") == "A" 
    select el;

    foreach (XElement el in cifmi)
    {
      textBox1.AppendText(el.Value + System.Environment.NewLine);
    }

代码找到两个值而不是一个。

1 个答案:

答案 0 :(得分:1)

var xDoc = XDocument.Load("Input.txt");

var alpha = (from a in xDoc.Root.Elements("alpha")
             let deltas = a.Elements("delta")
             let deltaA = deltas.First(x => (string)x.Attribute("Type") == "A")
             where (string)deltaA == "AlphaId2_DeltaTypeA"
             select a).First();

var descriptions = alpha.Elements("kapa")
                        .Select(x => (string)x.Element("description")).ToList();

它只会查找同时包含<delta>和值Type="A"的{​​{1}}。如果你只关心价值,试试那个:

AlphaId2_DeltaTypeA

更新

  

* alpha Id ==“AlphaId_1”和delta Type =“A”,答案是AlphaId1_DeltaTypeA *

var alpha = (from a in xDoc.Root.Elements("alpha")
             let deltas = a.Elements("delta")
             where deltas.Any(x => (string)x == "AlphaId2_DeltaTypeA")
             select a).First();