SQL Server 解析 XML 内容 并 加载 到 数据 库 . NET6

rsl1atfo  于 2022-11-21  发布在  其他
关注(0)|答案(1)|浏览(148)

我正在尝试解析一个XML文件(4层嵌套),并使用模型构建器将这些值附加到本地数据库中。我正在努力完成这一部分,所以我真的很感谢你的帮助。而且,正如你将看到的,我对这种语言和框架真的很陌生。

<machines>
  <machine>
    <manufacturer>SDBSDBSDKB</manufacturer>
    <name>NKSDBSDKJBDSKBDB</name>
    <description>
      <DEU>JBSDSBDKKJ</DEU>
      <ENU>NDSIDBSSKBKJB</ENU>
    </description>
    <type>DSIBDSDBJKSD</type>
    <number>0-200-84-3151</number>
    <cfg_r>
      <connection>JJSBJSBKDSJDBS</connection>
      <cfg_r_text> JHBSJBDISBKDBSKDBSBDKBSDKLN </cfg_r_text>
      <cfg_r_physical_unit_abbreviation> KBJSBDKSKJBSDSKJB 
      </cfg_r_physical_unit_abbreviation>
      <cfg_r_displaytext> JSDHSDVSDVSDDSKBJDB 
      </cfg_r_displaytext>
    </cfg_r> 
  </machine>
</machines>

下面是我正在尝试使用的一个xml文件的类似片段。特别是我正在尝试为一个'machine' dbset(级别2)创建一个模型构建器。“description”对象是这个machine dbset的属性的一部分;这里我用了一个外键来Map它,比如说:

[ForeignKey(nameof(MachineDescription.Id))]
public int DescriptionID { get; set; }

下面是MachineDescription类的说明

public class MachineDescription
    {
        public int Id { get; set; }
        public string DEU_desc { get; set; }

        public string ENU_desc { get; set; }

        [ForeignKey(nameof(Machine.Id))]
        public MachineDescription MachineId { get; set; }
    }

最后,这是我的建模工具:

modelBuilder.Entity<Models.Machine>().HasData(from machine in placeholder.Elements("machine")
                                                          select new Models.Machine
                                                          {
                                                              Id = idx++,
                                                              Manufacturer = machine.Element("manufacturer").Value,
                                                              Name = machine.Element("name").Value,
                                                              MachinesDecriptions.Append(
                                                                  new MachineDescription
                                                                  {
                                                                    Id = descID++,
                                                                    DEU_desc = machine.Element("description").Element("DEU").Value,
                                                                    ENU_desc = machine.Element("description").Element("ENU").Value,
                                                                    MachineId = descID
                                                                  }),


                                                              Type = machine.Element("type").Value,
                                                              Number = machine.Element("number").Value,
                                                          });

我希望得到一些帮助,让我的MachineDescription在我的Machine类中引用。手动添加它们不是一个选项

qxgroojn

qxgroojn1#

就像@ YitzhakKhabinsky在评论中提到的那样,最好只是将xml传递到数据库,并允许在那里解析它。
下面是一些示例代码,可以帮助您入门。

Declare @xml xml;
Set @xml = N'<machines>
  <machine>
    <manufacturer>SDBSDBSDKB</manufacturer>
    <name>NKSDBSDKJBDSKBDB</name>
    <description>
      <DEU>JBSDSBDKKJ</DEU>
      <ENU>NDSIDBSSKBKJB</ENU>
    </description>
    <type>DSIBDSDBJKSD</type>
    <number>0-200-84-3151</number>
    <cfg_r>
      <connection>JJSBJSBKDSJDBS</connection>
      <cfg_r_text> JHBSJBDISBKDBSKDBSBDKBSDKLN </cfg_r_text>
      <cfg_r_physical_unit_abbreviation> KBJSBDKSKJBSDSKJB 
      </cfg_r_physical_unit_abbreviation>
      <cfg_r_displaytext> JSDHSDVSDVSDDSKBJDB 
      </cfg_r_displaytext>
    </cfg_r> 
  </machine>
</machines>'

Select  Node.Data.value('manufacturer[1]', 'varchar(100)') As Manufacturer,
        Node.Data.value('name[1]', 'varchar(100)') As Name,
        Node.Data.value('description[1]/DEU[1]', 'varchar(100)') As Description_DEU,
        Node.Data.value('description[1]/ENU[1]', 'varchar(100)') As Description_ENU,
        Node.Data.value('type[1]', 'varchar(100)') As Type,
        Node.Data.value('number[1]', 'varchar(100)') As Number,
        Node.Data.value('cfg_r[1]/connection[1]', 'varchar(100)') As Cfg_Connection,
        Node.Data.value('cfg_r[1]/cfg_r_text[1]', 'varchar(100)') As Cfg_Text,
        Node.Data.value('cfg_r[1]/cfg_r_physical_unit_abbreviation[1]', 'varchar(100)') As Cfg_Abbreviation,
        Node.Data.value('cfg_r[1]/cfg_r_displaytext[1]', 'varchar(100)') As Cfg_DisplayText
From    @xml.nodes('machines/machine') Node(Data)

相关问题