2016-03-15 94 views
1

我试图将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文件具有在数据库中标记“名称”表列有列“名字”。

在将XML数据读入数据库表之前,我想XML标签必须被转换成数据库表列。在这种情况下,“名字”。

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

UPDATE

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

+0

你为什么设置'sql-server'标签?你只是想读一个现有的XML文件到你的C#应用​​程序?然后你写下你想将这个内容添加到现有的DataTable中,但是你正在创建一个新的DataTable实例......这是一个包含SQL Server的现有表吗?如果是这样的话:在SQL Server中创建存储过程并不容易,接受XML作为输入。在那里你可以用任何命名来撕碎XML,并做你想做的事......请给出详细信息(尤其是你的XML的一个例子) – Shnugo

+0

我想将XML数据中的XML数据添加到SQL服务器表中。 –

+0

请您回答我评论的问题吗?你最近的评论没有添加任何消息到这...只是想一个SO用户的头...我们不知道你真的想要什么... – Shnugo

回答

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对您的拼写非常严格,并且区分大小写为不会出现错误,如果您执行了错误操作,则不会出现错误。

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

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

+0

谢谢。只是一个问题。 'Person.'来自哪个'SELECT'? –

+0

@ Simon.S,当你查询XML时,你经常使用'.nodes(XPath)'开始你的“导航”。 '.nodes()'本身需要别名。所以 - 最后你会发现'AS(人)'。您可以将其作为表名和列名称。 – Shnugo

+0

哦,我明白了。但是它不是应该在某处获得XML文件的路径吗? –