将XML节点映射到数据表字段

时间:2009-07-21 00:29:23

标签: c# sql-server-2008

我是C#的新手,所以如果这是一项简单的任务我会道歉。我想做什么打开一个XML文件,其根节点是一个表名,根节点的子节点是字段名和值。然后,我想将字段映射到SQL Server数据库中的根节点表,并根据需要进行更新或插入。有没有人知道是否有更优雅的方法来执行此操作,而不是循环遍历节点树并构建SQL字符串?似乎应该有一种方法来绑定字段,就像XML文档是一个表单一样,只有它才会存在于内存中。再次,对不起,如果这个问题有一个明显的答案。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

最简单的方法可能是为xml类型创建一个简单的实体类,并使用XML Serialization属性将xml元素映射到类及其属性。然后,您可以使用标准XmlSerializer将xml反序列化为对象,或将对象序列化为xml。一旦有了一个对象,就可以很容易地使用OR映射器(LINQ to SQL,Entity Framework,NHibernate)或像iBatis这样的东西来执行你的实体类的更新/插入/删除。

答案 1 :(得分:0)

我使用OPENXML方法来解决此类任务。 BOL中有一个例子如何从XML中选择数据:

DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order OrderID="10248" CustomerID="VINET" EmployeeID="5" 
           OrderDate="1996-07-04T00:00:00">
      <OrderDetail ProductID="11" Quantity="12"/>
      <OrderDetail ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order OrderID="10283" CustomerID="LILAS" EmployeeID="3" 
           OrderDate="1996-08-16T00:00:00">
      <OrderDetail ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT stmt using OPENXML rowset provider
SELECT *
FROM   OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
         WITH (OrderID       int         '../@OrderID',
               CustomerID  varchar(10) '../@CustomerID',
               OrderDate   datetime    '../@OrderDate',
               ProdID      int         '@ProductID',
               Qty         int         '@Quantity')

因此,您可以使用INSERT .. SELECT FROM OPENXML语句将此数据插入DB。