3

これに関するlinqソリューションをネットで検索しましたが、非常に似たソリューションが見つかりません。

以下のxmlからcomformation要素を選択する方法を誰か教えてもらえますか? C# で linq を使用して、各コンポーネント (id、アカウント番号、タイプ) をオブジェクトに追加したいと考えています。

実際には、一度に1つの束/レコードでデータを取得してから、リストに追加したいと考えています。私は何を間違っていますか?

XML

string batch = @"
<batchresult>
      <outputs>
    <output>
      <value>
        <conformation>
          <component>
            <name>cmdinfo</name>
            <value>
              <bundle>
                <data>
                  <value>
                    <state>100</state>
                  </value>
                </data>
              </bundle>
            </value>
          </component>
          <component>
            <name>resultlist</name>
            <value>
              <bundle>
                <data>
                  <value>
                    <conformation>
                      <component>
                        <name>id</name>
                        <value>
                          <state>1</state>
                        </value>
                      </component>
                      <component>
                        <name>accountnumber</name>
                        <value>
                          <string>10505749</string>
                        </value>
                      </component>
                      <component>
                        <name>type</name>
                        <value>
                          <string>subnumber</string>
                        </value>
                      </component>
                    </conformation>
                  </value>
                  <value>
                    <conformation>
                      <component>
                        <name>id</name>
                        <value>
                          <state>2</state>
                        </value>
                      </component>
                      <component>
                        <name>accountnumber</name>
                        <value>
                          <string>53871265</string>
                        </value>
                      </component>
                      <component>
                        <name>type</name>
                        <value>
                          <string>subnumber</string>
                        </value>
                      </component>
                    </conformation>
                  </value>
                </data>
              </bundle>
            </value>
          </component>
          <component>
            <name>batchnumber</name>
            <value>
              <bundle>
                <data>
                  <value>
                    <state>14512367</state>
                  </value>
                </data>
              </bundle>
            </value>
          </component>
        </conformation>
      </value>
    </output>
  </outputs>
    </batchresult>";

コード

     class record
        {
            string F1 = "";
            public string f1
            {
                set { F1 = value; }
                get { return F1; }
            }

            string F2 = "";
            public string f2
            {
                set { F2 = value; }
                get { return F2; }
            }

            string F3 = "";
            public string f3
            {
                set { F3 = value; }
                get { return F3; }
            }
        }


    private void button1_Click(object sender, EventArgs e)
    {
            XDocument xmldoc = XDocument.Parse(batch);
            var obj = from o in xmldoc.Descendants("component")
                       where o.Parent.Name == "conformation"
    //select new record { f1 = o.Element("name").Value, f2 = o.Element("value").Value, f3 = o.Element("value").Value };

                       select new record { f1 = o.Element("id").Value, f2 = o.Element("accountnumber").Value, f3 = o.Element("type").Value };
            foreach (var d in obj)
            {
     record myobj = new record();
             myobj.f1=d.f1;//the first object will contain 1
             myobj.f2=d.f2; //10505749
             myobj.f3=d.f3;//subnumber .. and so on
             mylist.Add(myobj);
            }
    }

こんにちは、私は Deserialize を試していません。チェックしてみます。このコードを使用してあなたの 1 人から投稿された例:

XElement doc =  XElement.Parse(batch);
doc.Descendants("conformation").Elements("component").Select(x =>
new record
{
   f1 = x.First().Element("name").Value,
   f2 = x.Skip(1).First().Element("name").Value,
   f3 = x.Skip(2).Element("name").Value
};

..次のエラーが表示されます:

エラー 15 'System.Xml.Linq.XElement' には 'First' の定義が含まれておらず、タイプ 'System.Xml.Linq.XElement' の最初の引数を受け入れる拡張メソッド 'First' が見つかりませんでした (ディレクティブまたはアセンブリ参照を使用していますか?)

どうして?

4

1 に答える 1

0

これを試して

XDocument doc = XDocument.Parse(batch);
var result = doc.
    XPathSelectElements("//component[name[text() = 'resultlist']]").
    Descendants("conformation").
    Select(y => new record
        {
            f1 = (string)y.XPathSelectElement("component[name[text() = 'id']]/value/state"),
            f2 = (string)y.XPathSelectElement("component[name[text() = 'accountnumber']]/value/string"),
            f3 = (string)y.XPathSelectElement("component[name[text() = 'type']]/value/string")
        }
    );

XPath を使用しない場合:

var result = doc.
    Descendants("conformation").
    Select(x => x.Elements("component")).
    Select(y => y.Select(z => new { name = (string)z.Element("name"), value = z.Element("value") })).
    Where(z => z.Any(m => m.name == "id")).
    Select(a => new record
        {
            f1 = (string)a.Where(m => m.name == "id").FirstOrDefault().value.Element("state"),
            f2 = (string)a.Where(m => m.name == "accountnumber").FirstOrDefault().value.Element("string"),
            f3 = (string)a.Where(m => m.name == "type").FirstOrDefault().value.Element("string")
        }
    );
于 2012-12-05T19:05:19.620 に答える