は、ここでは、この
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string xml1 =
"<root>" +
"<users>" +
"<ID>1</ID>" +
"<user_login>admin</user_login>" +
"<user_pass>$P$Bdfdffddkjlkiyuyadnvjd</user_pass>" +
"<term_id>2</term_id>" +
"<user_activation_key></user_activation_key>" +
"<user_status>0</user_status>" +
"<display_name>admin</display_name>" +
"</users>" +
"</root>";
XElement users = XElement.Parse(xml1);
string xml2 =
"<root>" +
"<terms>" +
"<term_id>2</term_id>" +
"<name>name</name>" +
"<term_group>0</term_group>" +
"</terms>" +
"</root>";
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Login", typeof(string));
dt.Columns.Add("Password", typeof(string));
dt.Columns.Add("TermID", typeof(int));
dt.Columns.Add("Key", typeof(string));
dt.Columns.Add("Status", typeof(int));
dt.Columns.Add("DisplayName", typeof(string));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Group", typeof(int));
XElement terms = XElement.Parse(xml2);
try
{
var groups = from user in users.Elements("users")
join term in terms.Elements("terms")
on (int)user.Element("term_id") equals (int)term.Element("term_id")
select new { user = user, term = term };
foreach (var group in groups)
{
dt.Rows.Add(new object[] {
(int)group.user.Element("ID"),
(string)group.user.Element("user_login"),
(string)group.user.Element("user_pass"),
(int)group.user.Element("term_id"),
(string)group.user.Element("user_activation_key"),
(int)group.user.Element("user_status"),
(string)group.user.Element("display_name"),
(string)group.term.Element("Name"),
(int)group.term.Element("term_group")
});
}
frm.dgv_ShowUsers.DataSource = dt;
}
catch (Exception e)
{
}
}
}
}
は、通常のデータセットへの複雑なXMLを読みダイナミックソリューション
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string xml1Str =
"<root>" +
"<users>" +
"<ID>1</ID>" +
"<user_login>admin</user_login>" +
"<user_pass>$P$Bdfdffddkjlkiyuyadnvjd</user_pass>" +
"<term_id>2</term_id>" +
"<user_activation_key></user_activation_key>" +
"<user_status>0</user_status>" +
"<display_name>admin</display_name>" +
"</users>" +
"</root>";
XElement xml1 = XElement.Parse(xml1Str);
XElement xml1FirstNode = (XElement)xml1.FirstNode;
string[] xml1ColNames = xml1FirstNode.Elements().Select(x => x.Name.LocalName).ToArray();
string xml2Str =
"<root>" +
"<terms>" +
"<term_id>2</term_id>" +
"<name>name</name>" +
"<term_group>0</term_group>" +
"</terms>" +
"</root>";
XElement xml2 = XElement.Parse(xml2Str);
XElement xml2FirstNode = (XElement)xml2.FirstNode;
string[] xml2ColNames = xml2FirstNode.Elements().Select(x => x.Name.LocalName).ToArray();
DataTable dt = new DataTable();
string[] colNames = xml1ColNames.Union(xml2ColNames).ToArray();
foreach (var colName in colNames)
{
dt.Columns.Add(colName, typeof(string));
}
try
{
var groups = from x1 in xml1.Elements()
join x2 in xml2.Elements()
on (string)x1.Element("term_id") equals (string)x2.Element("term_id")
select new { x1 = x1, x2 = x2 };
foreach (var group in groups)
{
DataRow newRow = dt.Rows.Add();
foreach (var x1Value in group.x1.Elements())
{
newRow[x1Value.Name.LocalName] = (string)x1Value;
}
foreach (var x2Value in group.x2.Elements())
{
newRow[x2Value.Name.LocalName] = (string)x2Value;
}
}
frm.dgv_ShowUsers.DataSource = dt;
}
catch (Exception e)
{
}
}
}
}
で参加することは容易ではないジャグ配列を生成してみます。これらのケースでは、xmlを単一のデータテーブルに解析する独自のコードを記述することをお勧めします。私は通常これらの場合にxml linqを使用します。私はコードを書くためにxmlを見る必要があります。 – jdweng
XMLファイルがDataSetによって読み取られる場合、ルートタグはデータセットの名前です。 1番目の子タグはテーブルの名前です。次のレベルのタグは、テーブルの列名です。最終的に次のレベルのタグが実際のデータです。 xmlのネストされたタグのレベルが増えると、追加のデータテーブルが作成されますが、追加テーブルの主キーが整理されていないため、テーブルを結合することができません。 – jdweng
@jdwengあなたの答えをありがとう、私はまた、XMLコードを含む私の投稿を編集しました。 – rozeta