1

我有以下需要使用 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>

我需要获取 yyy where fieldlabel = questiontype 的值。我如何使用 linq 做到这一点?尝试了以下方法:

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,
                  };

让我知道

4

1 回答 1

0

要将结果缩小到fieldentry其兄弟fieldlabel为“question_type”的字段,您可以添加一个where子句:

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")
              };

有几点需要注意:

  • 我删除了所有这些Element电话。除非您有理由像以前一样具体,例如嵌套在不同元素中的重复元素名称,否则只需Descendants使用您感兴趣的名称即可。
  • 将元素结果转换为 时string,您也不应该调用,因为当该元素不存在时.Value会抛出 a 。NullReferenceException我删除了.Value调用并保留了字符串强制转换。
于 2013-09-25T02:19:03.217 回答