2009-07-21 9 views
0

私はC#を初めて使用しています。これは単純な作業であれば謝ります。私がしたいことは、ルートノードがテーブル名であり、ルートノードの子がフィールド名と値であるXMLファイルを開くことです。私は、フィールドをSQL Serverデータベースのルートノードのテーブルにマップし、必要に応じて更新または挿入したいと考えています。ノードツリーをループしてSQL文字列を構築するよりも、これを行うより洗練された方法があれば誰にも分かりますか? XML文書がフォームであるかのようにフィールドをバインドする方法がなければならないようですが、メモリ内にしか存在しません。再び、この質問には明らかな答えがある場合は申し訳ありません。助けを前にありがとう。XMLノードをデータテーブルのフィールドにマップする

答えて

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') 

、あなたがDBにこのデータを挿入するOPENXMLステートメントのFROM SELECT、INSERTを...使用することができます。

0

最も簡単な方法は、おそらくXML型の単純なエンティティクラスを作成し、XMLシリアル化属性を使用してxml要素をクラスとそのプロパティにマップすることです。標準のXmlSerializerを使用して、xmlをオブジェクトに逆シリアル化したり、オブジェクトをxmlにシリアル化したりすることができます。オブジェクトを取得したら、ORマッパー(LINQ to SQL、Entity Framework、NHibernate)やiBatisなどのエンティティクラスを使用して更新/挿入/削除を実行するのは簡単です。

関連する問題