【问题标题】:LINQ to XML query. Get element attributeLINQ to XML 查询。获取元素属性
【发布时间】:2014-08-05 18:03:22
【问题描述】:

由于Cannot convert lambda expression to delegate type,我无法获取答案属性。这些是我的课程和我的查询:

var file = XDocument.Load("QuestionsTest.xml");
var questions = from answers in file.Root.Elements("Question").Elements("Answers").Elements("Answer")
                        select new Answer
                        {
                            Text = (string)answers,
                            Correct = (string)answers.Elements("Answer").Single(answer=>(string)answer.Attribute("Correct"))
                        };

public class Answer
{
    public int AnswerID { get; set; }
    public string Text { get; set; }
    public string Correct { get; set; }
    public int Stats { get; set; }

    public int QuestionID { get; set; }
}

public class Question
{
    public virtual List<Answer> Answers { get; set; }
}

我的 XML 如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<Questions Subject="ADO.NET">
  <Question  NumberOfAnswers="1">
    <Text>Which class should you use to manage multiple tables and relationships among them?</Text>
    <Answers>
      <Answer>DataRow</Answer>
      <Answer>DataView</Answer>
      <Answer>DataTable</Answer>
      <Answer Correct="Yes">DataSet</Answer>
    </Answers>
 </Question>
  </Questions>

如何获取答案的属性?

【问题讨论】:

    标签: c# xml linq linq-to-xml


    【解决方案1】:

    Enumerable.Single 接受应返回 boolean 值的 Func&lt;T,bool&gt; 委托。您正在传递返回 XAttribute 值的委托。您应该 比较 属性值与 Yes 字符串以返回布尔结果:

    Single(answer => (string)answer.Attribute("Correct") == "Yes")
    

    这将解决您的错误。但我认为你也应该改变你的查询逻辑。首先更改Answer 类,并将Correct 属性设为布尔值:

    public class Answer
    {
        public int AnswerID { get; set; }
        public string Text { get; set; }
        public bool IsCorrect { get; set; }
        public int Stats { get; set; }
        public int QuestionID { get; set; }
    }
    

    查询应该是这样的:

    var xdoc = XDocument.Load("QuestionsTest.xml");
    var questions =
          from q in xdoc.Descendants("Question")
          select new Question {
              Answers = (from a in q.Descendants("Answer")
                         select new Answer {
                            Text = (string)a,
                            IsCorrect = (string)a.Attribute("Correct") == "Yes"
                        }).ToList()
          };
    

    【讨论】:

    • 这就是我最初拥有它的方式。但是因为我从字符串转换为布尔错误,所以我改变了它。
    【解决方案2】:
    var questions = from answers in 
        file.Root.Elements("Question").Elements("Answers").Elements("Answer")
        select new Answer
        {
            Text = (string)answers,
            Correct = (string)answers.Attribute("Correct")
        };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多