XmlDataDocumentにDataSetを同期させる例(ノードとフィールドに対応するプログラミング)

13877 ワード


関連するDataSetを介して構造化データを格納、取得、および操作することができる.
このタイプのすべてのメンバーのリストについては、XmlDataDocumentメンバーを参照してください.
System.Object     System.Xml.XmlNode        System.Xml.XmlDocument          System.Xml.XmlDataDocument
 
[C#]
public class XmlDataDocument : XmlDocument

 
 
[C++]
public __gc class XmlDataDocument : public XmlDocument

スレッドのセキュリティ
このタイプのすべての共通静的(Visual BasicではShared)メンバーは、マルチスレッド操作に対して安全です.ただし、インスタンスメンバーがスレッドで安全であることは保証されません.
コメント
このような拡張はXmlDocumentです.リレーショナルデータまたはXMLデータをロードし、W 3 Cドキュメントオブジェクトモデル(DOM)を使用して操作できます.DOMは、ノードオブジェクト階層としてデータを表示します.XmlDataDocumentはIXPathNavigableインタフェースを実装するため、XslTransformクラスのソースドキュメントとしても使用できます.
XmlDataDocumentは、ロードされたXMLデータの関係ビューを提供するDataSetクラスと密接な依存関係にあります.XmlDataDocumentへの変更は、DataSetに反映されます.逆も同様です.
XMLデータをDataSetにロードするには、ReadXmlSchemaを使用してリレーショナルマッピングを生成します.その後、LoadまたはLoadXmlを使用してXMLデータをロードすることができる.
リレーショナル・データをロードするには、リレーショナル・データを含むDataSetをXmlDataDocumentコンストラクタのパラメータとして指定します.
要求
ネームスペース:  System.Xml
プラットフォーム: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 シリーズ
プログラムセット: System.Data(System.Data.dll)
XmlDataDocumentクラスの新しいインスタンスを初期化します.リロードリストXmlDataDocumentクラスの新しいインスタンスを初期化します.[C#] public XmlDataDocument();[C++] public: XmlDataDocument();XmlDataDocumentクラスの新しいインスタンスを指定したDataSetで初期化します.[C#] public XmlDataDocument(DataSet);[C++] public: XmlDataDocument(DataSet*);例[Visual Basic,C#]次の例では、XmlDataDocumentにクライアント・テーブルをロードします.[Visual Basic,C#]この例では、SQL Server 2000 Northwindデータベースを使用します.[Visual Basic,C#]注意   この例では、XmlDataDocumentコンストラクタのリロード・バージョンを使用する方法を示します.他の使用可能な例については、個別のリロードトピックを参照してください.[C#] using System;using System.Data;using System.Xml;using System.Data.SqlClient;
public class Sample{  public static void Main()  {     DataSet dsNorthwind = new DataSet();
    //Create the connection string.                String sConnect;     sConnect="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind";                  //Create a connection object to connect to the northwind db.     SqlConnection nwconnect = new SqlConnection(sConnect);
    //Create a command string to select all the customers in the WA region.     String sCommand = "Select * from Customers where Region='WA'";
    //Create an adapter to load the DataSet.     SqlDataAdapter myDataAdapter = new SqlDataAdapter(sCommand, nwconnect);
    //Fill the DataSet with the selected records.     myDataAdapter.Fill(dsNorthwind,"Customers");
    //Load the document with the DataSet.     XmlDataDocument doc = new XmlDataDocument(dsNorthwind);  
    //Display the XmlDataDocument.     doc.Save(Console.Out);      }}
このセクションでは、XmlDataDocumentと同期した強力なタイプのDataSetを使用する受注処理の手順を説明します.次の例では、ソースXMLドキュメントの一部にのみ一致する最小化アーキテクチャを持つDataSetを作成します.これらの例では、ソースXMLドキュメントの歪みを回避するためにXmlDataDocumentを使用し、XMLドキュメントのサブセットを公開するためにDataSetを使用できます.
次のXMLドキュメントには、顧客情報、注文された貨物、出荷情報など、注文に関するすべての情報が含まれています.
<?xml version="1.0" standalone="yes"?>
<PurchaseOrder>
<Customers>
<CustomerID>CHOPS</CustomerID>
<Orders>
<OrderID>10966</OrderID>
<OrderDetails>
<OrderID>10966</OrderID>
<ProductID>37</ProductID>
<UnitPrice>26</UnitPrice>
<Quantity>8</Quantity>
<Discount>0</Discount>
</OrderDetails>
<OrderDetails>
<OrderID>10966</OrderID>
<ProductID>56</ProductID>
<UnitPrice>38</UnitPrice>
<Quantity>12</Quantity>
<Discount>0.15</Discount>
</OrderDetails>
<OrderDetails>
<OrderID>10966</OrderID>
<ProductID>62</ProductID>
<UnitPrice>49.3</UnitPrice>
<Quantity>12</Quantity>
<Discount>0.15</Discount>
</OrderDetails>
<CustomerID>CHOPS</CustomerID>
<EmployeeID>4</EmployeeID>
<OrderDate>1998-03-20T00:00:00.0000000</OrderDate>
<RequiredDate>1998-04-17T00:00:00.0000000</RequiredDate>
<ShippedDate>1998-04-08T00:00:00.0000000</ShippedDate>
<ShipVia>1</ShipVia>
<Freight>27.19</Freight>
<ShipName>Chop-suey Chinese</ShipName>
<ShipAddress>Hauptstr. 31</ShipAddress>
<ShipCity>Bern</ShipCity>
<ShipPostalCode>3012</ShipPostalCode>
<ShipCountry>Switzerland</ShipCountry>
</Orders>
<CompanyName>Chop-suey Chinese</CompanyName>
<ContactName>Yang Wang</ContactName>
<ContactTitle>Owner</ContactTitle>
<Address>Hauptstr. 29</Address>
<City>Bern</City>
<PostalCode>3012</PostalCode>
<Country>Switzerland</Country>
<Phone>0452-076545</Phone>
</Customers>
<Shippers>
<ShipperID>1</ShipperID>
<CompanyName>Speedy Express</CompanyName>
<Phone>(503) 555-9831</Phone>
</Shippers>
<Shippers>
<ShipperID>2</ShipperID>
<CompanyName>United Package</CompanyName>
<Phone>(503) 555-3199</Phone>
</Shippers>
<Shippers>
<ShipperID>3</ShipperID>
<CompanyName>Federal Shipping</CompanyName>
<Phone>(503) 555-9931</Phone>
</Shippers>
<Products>
<ProductID>37</ProductID>
<ProductName>Gravad lax</ProductName>
<QuantityPerUnit>12 - 500 g pkgs.</QuantityPerUnit>
<UnitsInStock>11</UnitsInStock>
<UnitsOnOrder>50</UnitsOnOrder>
<ReorderLevel>25</ReorderLevel>
</Products>
<Products>
<ProductID>56</ProductID>
<ProductName>Gnocchi di nonna Alice</ProductName>
<QuantityPerUnit>24 - 250 g pkgs.</QuantityPerUnit>
<UnitsInStock>21</UnitsInStock>
<UnitsOnOrder>10</UnitsOnOrder>
<ReorderLevel>30</ReorderLevel>
</Products>
<Products>
<ProductID>62</ProductID>
<ProductName>Tarte au sucre</ProductName>
<QuantityPerUnit>48 pies</QuantityPerUnit>
<UnitsInStock>17</UnitsInStock>
<UnitsOnOrder>0</UnitsOnOrder>
<ReorderLevel>0</ReorderLevel>
</Products>
</PurchaseOrder>

 
上記のXMLドキュメントに含まれる受注情報を処理する場合、1つのステップは、現在の在庫を使用して受注を供給することです.倉庫から受注を供給する従業員は、受注のすべてを表示する必要はありません.受注の製品情報のみを表示する必要があります.XMLドキュメントから製品情報を公開するには、強力なタイプのDataSetを作成します.tはXMLアーキテクチャ定義言語(XSD)アーキテクチャとして記述され、注文された製品および数量にマッピングされたアーキテクチャを有する.強いタイプのDataSetオブジェクトの詳細については、タイプ化されたDataSetの使用を参照してください.
次のコードは、この例から生成された強力なタイプのDataSetのアーキテクチャを示します.
<?xml version="1.0" standalone="yes"?>
<xs:schema id="OrderDetail" xmlns=""
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:codegen="urn:schemas-microsoft-com:xml-msprop"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="OrderDetail" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="OrderDetails" codegen:typedName="LineItem" codegen:typedPlural="LineItems">
<xs:complexType>
<xs:sequence>
<xs:element name="OrderID" type="xs:int" minOccurs="0" codegen:typedName="OrderID"/>
<xs:element name="Quantity" type="xs:short" minOccurs="0" codegen:typedName="Quantity"/>
<xs:element name="ProductID" type="xs:int" minOccurs="0" codegen:typedName="ProductID"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Products" codegen:typedName="Product" codegen:typedPlural="Products">
<xs:complexType>
<xs:sequence>
<xs:element name="ProductID" type="xs:int" minOccurs="0" codegen:typedName="ProductID"/>
<xs:element name="ProductName" type="xs:string" minOccurs="0" codegen:typedName="ProductName"/>
<xs:element name="QuantityPerUnit" type="xs:string" minOccurs="0" codegen:typedName="QuantityPerUnit"/>
<xs:element name="UnitsInStock" type="xs:short" minOccurs="0" codegen:typedName="UnitsInStock"/>
<xs:element name="UnitsOnOrder" type="xs:short" minOccurs="0" codegen:typedName="UnitsOnOrder"/>
<xs:element name="ReorderLevel" type="xs:short" minOccurs="0" codegen:typedName="ReorderLevel"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:unique name="Constraint1">
<xs:selector xpath=".//Products" />
<xs:field xpath="ProductID" />
</xs:unique>
<xs:keyref name="Relation1" refer="Constraint1" codegen:typedChildren="GetLineItems" codegen:typedParent="Product">
<xs:selector xpath=".//OrderDetails" />
<xs:field xpath="ProductID" />
</xs:keyref>
</xs:element>
</xs:schema>

 
なお、DataSetのアーキテクチャには、初期XMLドキュメントからのOrderDetailsおよびProducts要素の情報のみが含まれています.DataSetをXmlDataDocumentと同期させることで、DataSetに含まれていない要素がXMLドキュメントに保持されることを確認できます.
XMLアーキテクチャ(名前空間がNorthwind.FillOrder)からの使用生成された強力なタイプのDataSetは、ソースXMLドキュメントからロードされたXmlDataDocumentにDataSetを同期させることで、初期XMLドキュメントの一部を公開できます.スキーマから生成されたDataSetには構造が含まれていますが、データは含まれていません.XMLをXmlDataDocumentにロードすると、これらのデータが入力されます.すでにデータが含まれているDataSetと同じようにロードしようとするとステップXmlDataDocumentでは、例外が発生します.
DataSet(およびXmlDataDocument)が更新されると、XmlDataDocumentは変更されたXMLドキュメントを書き出すことができ、DataSetに無視された要素は変わらない(以下に示す).受注例では、受注項目を入力すると、変更されたXMLドキュメントは受注プロセスの次のステップ(会社の貨物輸送部に渡される可能性がある)に渡されます.
 
using System;
using System.Data;
using System.Xml;
using Northwind.FillOrder;
public class Sample
{
public static void Main()
{
OrderDetail orderDS = new OrderDetail();
XmlDataDocument xmlDoc = new XmlDataDocument(orderDS);
xmlDoc.Load("Order.xml");
foreach (OrderDetail.LineItem myItem in orderDS.LineItems)
{
OrderDetail.Product myProd = myItem.Product;
// Remove quantity from the current stock.
myProd.UnitsInStock = (short)(myProd.UnitsInStock - myItem.Quantity);
// If the remaining stock is less than the reorder level, order more.
if ((myProd.UnitsInStock + myProd.UnitsOnOrder) < myProd.ReorderLevel)
myProd.UnitsOnOrder = (short)(myProd.UnitsOnOrder + myProd.ReorderLevel);
}
xmlDoc.Save("Order_out.xml");
}
}