【问题标题】:linq to xml query: Object reference not set error while trying to retrieve child elementlinq to xml 查询:尝试检索子元素时未设置对象引用错误
【发布时间】:2013-01-10 06:46:48
【问题描述】:

我正在尝试检索所有子元素,但获取 System.Collections.ListDictionaryInternal。对象引用未设置为对象错误的实例。

我的 c# 代码根据传递的 test_id 和 category_id 检索所有问题:-

public static List<Questions> GetQuestion_Catgy(int test_id, int ctgy_id)
        {
            try
            {
                XDocument data = XDocument.Load(docurl);
                return (from exm in data.Descendants("test_details")
                        where exm.Attribute("id").Value.Equals(test_id.ToString())
                        from ctgy in exm.Descendants("category")
                        where ctgy.Attribute("id").Value.Equals(ctgy_id.ToString())
                        orderby (int)ctgy.Attribute("id")
                        select new Questions
                        {
                            quesID = Convert.ToInt32(ctgy.Attribute("id").Value),
                            quesSTRING = ctgy.Attribute("ques").Value,
                            quesRATE = Convert.ToInt32(ctgy.Attribute("rating").Value),
                            quesOPT1 = (string)ctgy.Element("opt1").Value,
                            quesOPT2 = (string)ctgy.Element("opt2").Value,
                            quesOPT3 = (string)ctgy.Element("opt3").Value,
                            quesOPT4 = (string)ctgy.Element("opt4").Value,
                            quesANS = Convert.ToInt32(ctgy.Element("ans").Value),
                            quesIMG = (string)ctgy.Element("img").Value
                        }).ToList();
            }
            catch (Exception ex)
            {
                throw new ArgumentException(ex.Data + "\n" + ex.Message);
            }
        }

我的 xml

<test_details id="1" name="test exam" time="30" marks="100" difficulty="1">
    <category id="1" name="HTML">
      <question id="1" ques="what is HTML ?" rating="5">
        <opt1>Markup Language</opt1>
        <opt2>Scripting Language</opt2>
        <opt3>Server-Side Lanugae</opt3>
        <opt4>Client-Side Language</opt4>
        <ans>1</ans>
        <img>null</img>
      </question>
      <question id="2" ques="what is LMTH ?" rating="5">
        <opt1>Markup Language</opt1>
        <opt2>Scripting Language</opt2>
        <opt3>Server-Side Lanugae</opt3>
        <opt4>Client-Side Language</opt4>
        <ans>2</ans>
        <img>null</img>
      </question>
    </category>
    <category id="2" name="C#" />
  </test_details>

【问题讨论】:

  • 通过重新抛出包装的异常,您将丢失原始堆栈跟踪。如果您不处理异常,请让它自行传播。 (原始堆栈跟踪也可能有助于查找您的空引用。)
  • 查询检索问题元素,但问题出在选择和分配部分。

标签: c# linq-to-xml


【解决方案1】:

如果您想访问ques 属性,您似乎需要对“问题”元素再下一层。 ctgy 不会有ques

【讨论】:

    【解决方案2】:
    ctgy.Attribute("ques").Value
    ctgy.Attribute("rating").Value
    

    没有这样的属性。

    在做类似的事情之前做一个空检查

    (string)ctgy.Element("opt2").Value,
    

    【讨论】:

      【解决方案3】:

      你的错误在这一行:

      from ctgy in exm.Descendants("category")
      

      exm 元素与您的类别处于同一级别。您需要将exm 替换为data

      例子:

      from ctgy in data.Descendants("category")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多