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>

fieldlabel = questiontype の yyy の値を取得する必要があります。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兄弟が「question_type」であるフィールドに結果を絞り込むには、句fieldlabelを追加できます。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呼び出しも行うべきではありません。呼び出しを削除し、文字列キャストを保持しました。.ValueNullReferenceException.Value
于 2013-09-25T02:19:03.217 に答える