将XML文件读取到现有的数据库表

时间:2016-03-15 16:03:01

标签: c# sql-server xml

我正在尝试将XML文件读入已存在的数据库表中。

问题是XML标记和数据库列没有相同的名称,尽管它们具有相同的数据类型。因此,我想将XML标记“转换”到数据库列中,以便可以输入数据库。 我不知道该怎么做。

这是我到目前为止所做的。

 static void writeToDatabase()
        {
            XmlDocument doc= new XmlDocument();
            try {
                //Reading the xml
                  doc.Load("C:\\Temp\navetout.xml");


                 DataTable dt = new DataTable();

               //Code here to read the xml into an already existing database table?



                } 

            catch (Exception e) 
            {
                Console.WriteLine(e.Message);
            }

        }

数据库位于另一台服务器上,我已将其包含在app.config

 <connectionStrings>
    <add name="CS"
    connectionString="Data Source=tsrv2062;Initial Catalog=BUMS;Integrated Security=True"/>
  </connectionStrings>

让我们假设一个例子,XML文件的标签为“ Name ”,而数据库表列的列为“ Firstname ”。

在将XML数据读入数据库表之前,我认为必须将XML标记转换为Database表列。在这种情况下,“名字”。

任何人都可以帮我解决这个“翻译”和阅读数据库表。

更新

XML示例:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfFolkbokforingspostTYPE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FolkbokforingspostTYPE>
    <Sekretessmarkering xsi:nil="true" />
    <Personpost>
      <PersonId>
        <PersonNr>7527245452542</PersonNr>
      </PersonId>
      <HanvisningsPersonNr xsi:nil="true" />
      <Namn>
        <Tilltalsnamnsmarkering>20</Tilltalsnamnsmarkering>
        <Fornamn>skjdgnsdng</Fornamn>
        <Mellannamn xsi:nil="true" />
        <Efternamn>sdsdgsdgs</Efternamn>
        <Aviseringsnamn xsi:nil="true" />
      </Namn>
      <Folkbokforing>
        <Folkbokforingsdatum>20060512</Folkbokforingsdatum>
        <LanKod>56</LanKod>
        <KommunKod>77</KommunKod>
        <ForsamlingKod xsi:nil="true" />
        <Fastighetsbeteckning>PÅLNGE 6:38</Fastighetsbeteckning>
        <FiktivtNr>0</FiktivtNr>
      </Folkbokforing>
      <Adresser>
        <Folkbokforingsadress>
          <CareOf xsi:nil="true" />
          <Utdelningsadress1 xsi:nil="true" />
          <Utdelningsadress2>sgdsdgsdgs</Utdelningsadress2>
          <PostNr>78965</PostNr>
          <Postort>PÅLÄNG</Postort>
        </Folkbokforingsadress>
        <Riksnycklar>
          <FastighetsId>46464545</FastighetsId>
          <AdressplatsId>764846846</AdressplatsId>
          <LagenhetsId>45465654645</LagenhetsId>
        </Riksnycklar>
      </Adresser>
      <Fodelse>
        <HemortSverige>
          <FodelselanKod>00</FodelselanKod>
          <Fodelseforsamling>NEDERKALIX</Fodelseforsamling>
        </HemortSverige>
      </Fodelse>
      <Medborgarskap>
        <MedborgarskapslandKod>SE</MedborgarskapslandKod>
        <Medborgarskapsdatum>0</Medborgarskapsdatum>
      </Medborgarskap>
    </Personpost>
  </FolkbokforingspostTYPE>

更新2:

这些是数据库表的列:

PersonalIdentityNumber
ProtectedIdentity
ReferedCivicRegistrationNumber
UnregistrationReason
UnregistrationDate
MessageComputerComputer
GivenNameNumber
FirstName
MiddleName
LastName
NotifyName
NationalRegistrationDate
NationalRegistrationCountyCode
NationalRegistrationMunicipalityCode
NationalRegistrationCoAddress
NationalRegistrationDistributionAddress1
NationalRegistrationDistributionAddress2
NationalRegistrationPostCode
NationalRegistrationCity
NationalRegistrationNotifyDistributionAddress
NationalRegistrationNotifyPostCode
NationalRegistrationNotifyCity
ForeignDistrubtionAddress1
ForeignDistrubtionAddress2
ForeignDistrubtionAddress3
ForeignDistrubtionCountry
ForeignDate
BirthCountyCode
BirthParish
ForeignBirthCity
CitizenshipCode
CitizenshipDate
Email
Telephone
Mobiletelephone
Gender
NotNewsPaper
Note
StatusCode
NationalRegistrationCode
RegistrationDate
LastUpdatedFromNavet
TemporaryDistrubtionAddress1
TemporaryDistrubtionAddress2
TemporaryDistrubtionAddress3
TemporaryDistrubtionCountry
Password
VisibilityLevel
LastChangedBy
LastChangedDate
SeamanIdentity
Category

此处举例来说,<PersonNr> tagg和数据库列PersonalIdentityNumber是相同的。 与XML标记不匹配的列应该返回null

1 个答案:

答案 0 :(得分:1)

我不知道,哪些值映射到哪个列,我只给出一个如何执行此操作的示例。但是在这个模板之后添加其余内容应该很容易。

使用这样的代码可以将值插入表格中。

INSERT INTO YourTable(PersonalIdentityNumber, ... , FirstName,MiddleName,LastName, ...)
SELECT Person.value('(PersonId/PersonNr)[1]','varchar(max)') AS PersonalIdentityNumber
      ,... 
      ,Person.value('(Namn/Fornamn)[1]','varchar(max)') AS FirstName
      ,Person.value('(Namn/Mellannamn)[1]','varchar(max)') AS MiddleName
      ,Person.value('(Namn/Efternamn)[1]','varchar(max)') AS LastName
      ,...

FROM @xml.nodes('/ArrayOfFolkbokforingspostTYPE/FolkbokforingspostTYPE/Personpost') AS The(Person)

实际上,我没有必要像我在这里所做的那样命名SELECT的列。使用INSERT INTO定义列列表,下面的SELECT必须以正确的计数和顺序返回这些列。

你必须要知道,XPath对你的拼写是非常严格的并且区分大小写如果你做错了就不会有错误,只是一个NULL。

如果您对XML查询没有经验:只需在--前放置一个INSERT INTO,就可以显示SELECT的结果。如果一切正常,请删除--,然后将数据插入到您的表格中。

要从您的应用程序轻松调用,您可以将其放入Stored Procedure并将XML作为参数传递。