如何使用linq解析此xml

如何使用linq解析此xml,xml,linq,Xml,Linq,我需要使用linq解析和获取以下xml值 <?xml version="1.0" encoding="UTF-8"?> <questestinterop xmlns="http://www.imsglobal....." xmlns:xsi="http://www.w3.org...." xsi:schemaLocation="http://www.imsglobal.org/.....xsd"> <assessment ident="gh" title="Sa

我需要使用linq解析和获取以下xml值

<?xml version="1.0" encoding="UTF-8"?>
<questestinterop xmlns="http://www.imsglobal....." xmlns:xsi="http://www.w3.org...." xsi:schemaLocation="http://www.imsglobal.org/.....xsd">
  <assessment ident="gh" title="Sample">
    <qtimetadata>
      <qtimetadatafield>
        <fieldlabel>cc_maxattempts</fieldlabel>
        <fieldentry>1</fieldentry>
      </qtimetadatafield>
    </qtimetadata>
    <section ident="rs">
      <item ident="ghg" title="Question">
        <itemmetadata>
          <qtimetadata>
            <qtimetadatafield>
              <fieldlabel>question_type</fieldlabel>
              <fieldentry>yyy</fieldentry>
            </qtimetadatafield>
            <qtimetadatafield>
               <fieldlabel>points_possible</fieldlabel>
               <fieldentry>1</fieldentry>
            </qtimetadatafield>
            <qtimetadatafield>
                <itemmetadata>
                <presentation>
                  .........
                </presentation>
      </item>
      <item ident="hj" title="Question">
        ....
      </item>
    </section>
  </assessment>
</questestinterop>
让我知道

要将结果缩小到其同级fieldlabel为问题类型的fieldentry字段,可以添加where子句:

有几件事需要注意:

我删除了所有的元素调用。除非您有理由像以前一样具体,例如嵌套在不同元素中的重复元素名,否则只需获取具有您感兴趣的名称的子体就足够了。 将元素结果强制转换为字符串时,您不应该同时调用.Value,因为当该元素不存在时,这将引发NullReferenceException。我删除了.Value调用并保留了字符串类型转换。
另外,缩进XML,不可能知道元素的结尾在哪里。bobby-添加了我尝试的内容。米利穆斯-缩进。谢谢艾哈迈德,太完美了。
XDocument document = XDocument.Load(assessmentXmlName);
XNamespace ns = "http://www.imsglobal.org/xsd/ims_qtiasiv1p2";


var results = from main in document.Root
             .Elements(ns + "assessment")
             .Elements(ns + "section")
             .Elements(ns + "item")
             .Elements(ns + "itemmetadata")
             .Elements(ns + "qtimetadata")
             .Descendants("qtimetadatafield")
              select new
                  {
                      itemtype = (string)main.Element(ns + "fieldentry").Value,
                  };
var results = from main in document.Root
                            .Descendants(ns + "qtimetadatafield")
              where (string)main.Element(ns + "fieldlabel") == "question_type"
              select new
              {
                  itemtype = (string)main.Element(ns + "fieldentry")
              };