我需要使用LINQ to XML查询来确定值?

时间:2011-09-15 07:11:27

标签: c# asp.net sql xml linq

<?xml version="1.0" encoding="utf-8" ?>
<MYROOT>
  <Group name="G1">
      <Skill name="G1Skill1">
              <SubSkill>G1skill1sub1</SubSkill>
              <SubSkill>G1skill1sub2</SubSkill>
      </Skill >
    <Skill name="G1Skill2">
              <SubSkill>G1skill2sub1</SubSkill>
              <SubSkill>G1skill2sub2</SubSkill>
      </Skill >
  </Group>
  <Group name="G2">
    <Skill name="G2Skill1">
              <SubSkill>G2skill1sub1</SubSkill>
              <SubSkill>G2skill1sub2</SubSkill>
    </Skill >
    <Skill name="G2Skill2">
              <SubSkill>G2skill2sub1</SubSkill>
              <SubSkill>G2skill2sub2</SubSkill>
    </Skill >
 </Group>
</MYROOT>

例如。 输入为"G1"&amp; "G1skill1sub1"

预期输出= G1Skill1(使用单个LINQ to XML)

我试过这段代码:

  var xmlDoc = XDocument.Load(Server.MapPath("XMLFile1.xml"));
        var skills =
        from skill in xmlDoc.Descendants("Group")
        where skill.Attribute("name").Value.Equals("G1") // && skill.Element("SubSkill").Value.Equals("Group")
        select new
            {
                Myskill = skill.Element("Skill").Value,
                mytext= skill.Attribute("name").Value,
            };

但是没有得到正确的输出。

2 个答案:

答案 0 :(得分:2)

我会用:

var skills = from group in doc.Descendants("Group")
             where (string) group.Attribute("name") == "G1"
             from subskill in group.Descendants("SubSkill")
             where (string) subskill == "G1skill1sub1"
             select (string) subskill.Parent.Attribute("name");

这取决于您的输入和预期输出:

  • 查找所有匹配的组
  • 查找这些组中所有匹配的子技能
  • 对于每个匹配的子技能,找到父级(技能)的名称

答案 1 :(得分:0)

我试过这样,工作正常

         string input1 = "G1";
        string input2 = "G1skill1sub1";

        string output =
            (from skill in xdoc.Descendants("Skill")
             let subskill = skill.Element("SubSkill")
             let g = skill.Parent
             where g.Name == "Group" && g.Attribute("name").Value == input1
             && subskill != null && subskill.Value == input2
             select skill.Attribute("name").Value).FirstOrDefault();

        Console.WriteLine(output);