gpt4 book ai didi

c# - 将 XML 结构解析(并保留)到 SQL Server 中

转载 作者:太空宇宙 更新时间:2023-11-03 13:52:29 24 4
gpt4 key购买 nike

我希望通过 C# 解析一个相对复杂的 XML 文件,并将选择的数据存储到 SQL Server '08 数据库中。这是我要从 XML 文件中提取的内容:

<educationSystem>
<school>
<name>Primary School</name>
<students>
<student id="123456789">
<name>Steve Jobs</name>
<other elements>More Data</other elements>
</student>
<student id="987654">
<name>Jony Ive</name>
<otherElements>More Data</otherElements>
</student>
</students>
</school>
<school>
<name>High School</name>
<students>
<student id="123456">
<name>Bill Gates</name>
<other elements>More Data</other elements>
</student>
<student id="987654">
<name>Steve Ballmer</name>
<otherElements>More Data</otherElements>
</student>
</students>
</school>
</educationSystem>

[在你问之前,不,这不是学校作业 - 我以学校/学生为例,因为原件要敏感得多。]

我能够(使用 XDocument/XElement)解析 XML 文件并获得所有学校名称、学生姓名和学生 ID 的列表,但是当它被添加到数据库中时,我最终得到了 Bill Gates 学生入学正隶属于第二所学校。一切都只是一行一行的。

我正在寻找一种方式来实现这一目标:

Foreach school
put it's name into an XElement
foreach student
grab the name and id put into XElements
Grab next school and repeat

我相信 Linq 是实现这一目标的最佳方式,但我在如何开始这个过程方面遇到了麻烦。谁能给我指出正确的方向?

编辑:这是我目前用来将数据保存到数据库的代码。它一次处理一个列表(因此事情并不像它们应该的那样相关)。我还将整理 SQL。

 private void saveToDatabase (List<XElement> currentSet, String dataName)
{
SqlConnection connection = null;

try
{
string connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString + "; Asynchronous Processing=true";
connection = new SqlConnection(connectionString);
connection.Open();

foreach (XElement node in currentSet)
{
SqlCommand sqlCmd = new SqlCommand("INSERT INTO dbo.DatabaseName (" + dataName + ") VALUES ('" + node.Value + "')", connection);

sqlCmd.ExecuteNonQuery();
}
}

最佳答案

此 LINQ 将生成具有两个属性的对象集合

  1. 学校名称

  2. 学生名单(又是一个集合)

     var result = XElement.Load("data.xml")
    .Descendants("school")
    .Select( x => new {
    name = XElement.Parse(x.FirstNode.ToString()).Value,
    students =x.Descendants("student")
    .Select(stud => new {
    id = stud.Attribute("id"),
    name = XElement.Parse(stud.FirstNode.ToString()).Value})
    .ToList()});

    注意:LINQ 假定 <name>作为 <school> 下的第一个节点和 <student>标签

  3. 然后您可以使用您想要的 foreach,它会像魅力一样工作

     foreach (var school in result)
    {
    var schoolName = school.name;
    foreach (var student in school.students)
    {
    //Access student.id and student.name here
    }
    }

关于c# - 将 XML 结构解析(并保留)到 SQL Server 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13305847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com