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