C# 如何从SQL Server动态检索XML节点,并使用XDocument从带有它们的模板构建文件?

C# 如何从SQL Server动态检索XML节点,并使用XDocument从带有它们的模板构建文件?,c#,sql-server,xml,linq-to-xml,C#,Sql Server,Xml,Linq To Xml,我有一个包含我需要的所有标题的XML模板。我使用XDocument加载它,然后使用XElements构建节点。然而,这意味着我目前正在硬编码我需要进入我的文件的数据位 我注意到使用SQLServer可以使用XML数据类型在数据库中存储数据。使用这种方法,最好查看每个记录并动态构建XML文件 然而,我发现我的方法存在一些问题。可能有两个节点共享同一父节点。是否有方法存储节点及其父节点,并使用XDocument中的某些内容合并它们 下面是我的XML的一个示例块 <AddInfoCollecti

我有一个包含我需要的所有标题的XML模板。我使用XDocument加载它,然后使用XElements构建节点。然而,这意味着我目前正在硬编码我需要进入我的文件的数据位

我注意到使用SQLServer可以使用XML数据类型在数据库中存储数据。使用这种方法,最好查看每个记录并动态构建XML文件

然而,我发现我的方法存在一些问题。可能有两个节点共享同一父节点。是否有方法存储节点及其父节点,并使用XDocument中的某些内容合并它们

下面是我的XML的一个示例块

<AddInfoCollection>
    <AddInfo>
        <Key>TransportReference</Key>
        <Value>666777888</Value>
    </AddInfo>              
    <AddInfo>
        <Key>UI_NKCarrierSCAC</Key>
        <Value>ABCD</Value>
    </AddInfo>              
    <AddInfo>
        <Key>SchDLoading</Key>
        <Value>1234</Value>
    </AddInfo>  
    <AddInfo>
        <Key>SchDArrival</Key>
        <Value>12345</Value>
    </AddInfo>                  
</AddInfoCollection>
使用

例如:

USE ADVENTUREWORKS
SELECT TOP 2 * FROM HUMANRESOURCES.EMPLOYEE FOR XML PATH
这将以以下XML形式返回结果集。使用SELECT…FOR XML的其他变体来定制XML以满足您的需求

<row>
  <EmployeeID>1</EmployeeID>
  <NationalIDNumber>14417807</NationalIDNumber>
  <ContactID>1209</ContactID>
  <LoginID>adventure-works\guy1</LoginID>
  <ManagerID>16</ManagerID>
  <Title>Production Technician - WC60</Title>
  <BirthDate>1972-05-15T00:00:00</BirthDate>
  <MaritalStatus>M</MaritalStatus>
  <Gender>M</Gender>
  <HireDate>1996-07-31T00:00:00</HireDate>
  <SalariedFlag>0</SalariedFlag>
  <VacationHours>21</VacationHours>
  <SickLeaveHours>30</SickLeaveHours>
  <CurrentFlag>1</CurrentFlag>
  <rowguid>AAE1D04A-C237-4974-B4D5-935247737718</rowguid>
  <ModifiedDate>2004-07-31T00:00:00</ModifiedDate>
</row>
<row>
  <EmployeeID>2</EmployeeID>
  <NationalIDNumber>253022876</NationalIDNumber>
  <ContactID>1030</ContactID>
  <LoginID>adventure-works\kevin0</LoginID>
  <ManagerID>6</ManagerID>
  <Title>Marketing Assistant</Title>
  <BirthDate>1977-06-03T00:00:00</BirthDate>
  <MaritalStatus>S</MaritalStatus>
  <Gender>M</Gender>
  <HireDate>1997-02-26T00:00:00</HireDate>
  <SalariedFlag>0</SalariedFlag>
  <VacationHours>42</VacationHours>
  <SickLeaveHours>41</SickLeaveHours>
  <CurrentFlag>1</CurrentFlag>
  <rowguid>1B480240-95C0-410F-A717-EB29943C8886</rowguid>
  <ModifiedDate>2004-07-31T00:00:00</ModifiedDate>
</row>

不幸的是,由于表格和数据的设计,这是行不通的。基本上,这不是我们从DB得到的唯一东西。可能有各种其他类型的嵌套元素数量不计其数。在这一点上,对字段进行硬编码看起来更为实际,因为可能没有办法使我的数据库足够通用,以容纳需要满足模板要求的任何XML。
<row>
  <EmployeeID>1</EmployeeID>
  <NationalIDNumber>14417807</NationalIDNumber>
  <ContactID>1209</ContactID>
  <LoginID>adventure-works\guy1</LoginID>
  <ManagerID>16</ManagerID>
  <Title>Production Technician - WC60</Title>
  <BirthDate>1972-05-15T00:00:00</BirthDate>
  <MaritalStatus>M</MaritalStatus>
  <Gender>M</Gender>
  <HireDate>1996-07-31T00:00:00</HireDate>
  <SalariedFlag>0</SalariedFlag>
  <VacationHours>21</VacationHours>
  <SickLeaveHours>30</SickLeaveHours>
  <CurrentFlag>1</CurrentFlag>
  <rowguid>AAE1D04A-C237-4974-B4D5-935247737718</rowguid>
  <ModifiedDate>2004-07-31T00:00:00</ModifiedDate>
</row>
<row>
  <EmployeeID>2</EmployeeID>
  <NationalIDNumber>253022876</NationalIDNumber>
  <ContactID>1030</ContactID>
  <LoginID>adventure-works\kevin0</LoginID>
  <ManagerID>6</ManagerID>
  <Title>Marketing Assistant</Title>
  <BirthDate>1977-06-03T00:00:00</BirthDate>
  <MaritalStatus>S</MaritalStatus>
  <Gender>M</Gender>
  <HireDate>1997-02-26T00:00:00</HireDate>
  <SalariedFlag>0</SalariedFlag>
  <VacationHours>42</VacationHours>
  <SickLeaveHours>41</SickLeaveHours>
  <CurrentFlag>1</CurrentFlag>
  <rowguid>1B480240-95C0-410F-A717-EB29943C8886</rowguid>
  <ModifiedDate>2004-07-31T00:00:00</ModifiedDate>
</row>