我创建了以下代码来从XML获取用户:
string userName = "user";
string password = "password";
string uri = @"uri";
WebClient webClient = new WebClient();
webClient.Credentials = new NetworkCredential(userName, password);
Stream stream = webClient.OpenRead(uri);
XElement output = XElement.Load(stream);
IEnumerable<XElement> users = from el in output.Elements() select el;
foreach (XElement str in users)
{
Console.WriteLine(str);
}
结果:
<User>
<ObjectId>3cbde</ObjectId>
<Alias>alias</Alias>
<DisplayName>Display Name</DisplayName>
<TimeZone>0</TimeZone>
<Language>0</Language>
<ListInDirectory>false</ListInDirectory>
<IsVmEnrolled>true</IsVmEnrolled>
</User>
现在我想将数据插入到数据库中,但我想将每个字段作为单独的列 - 数据库中的表包含列: ObjectId , DisplayName , TimeZone 等 你能否告诉我一些如何轻松完成的建议?我需要将其转换为DataTable吗?
答案 0 :(得分:1)
在这个例子中,我在本地获取XML流,用于测试目的。只需将其更改为获取流的方法(WebClient)。也使用SqlBulkCopy
,我没有看到这样做的任何缺点加上,如果你最终要插入很多行,那就会更快。可能有更好的方法来重构这个,但粗略地说:
SqlBulkCopy bulkCopy = new SqlBulkCopy("ConnectionString...");
bulkCopy.DestinationTableName = "PhysicalTableName";
DataTable dt = new DataTable("PhysicalTableName");
dt.Columns.Add("ObjectId");
dt.Columns.Add("Alias");
dt.Columns.Add("DisplayName");
dt.Columns.Add("TimeZone");
dt.Columns.Add("Language");
dt.Columns.Add("ListInDirectory");
dt.Columns.Add("IsVmEnrolled");
XElement output = XElement.Load("c:\\temp\\input.xml");
IEnumerable<XElement> users = output.Elements();
foreach (XElement str in users)
{
DataRow dr = dt.NewRow();
foreach (XElement node in str.Elements())
{
dr[node.Name.LocalName] = node.Value;
}
dt.Rows.Add(dr);
}
bulkCopy.WriteToServer(dt);
我没有关于表格架构的任何信息,所以默认情况下,在此示例中,所有列都是String
类型。
不要忘记异常处理。