これに関する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' が見つかりませんでした (ディレクティブまたはアセンブリ参照を使用していますか?)
どうして?