DataSet’i bir XmlDataDocument ile Eşitleme
Bu bölümde, bir satın alma siparişinin işlenmesinde bir adım gösterilmektedir ve türü kesin olarak belirlenmiş DataSet bir XmlDataDocumentile eşitlenir. İzleyen örnekler, kaynak XML belgesinin yalnızca bir bölümüyle eşleşen simge durumuna küçültülmüş şemaya sahip bir DataSet oluşturur. Örneklerde, kaynak XML belgesinin doğruluğunu korumak için XmlDataDocument kullanılır ve DataSet, XML belgesinin bir alt kümesini kullanıma sunar.
Aşağıdaki XML belgesi, bir satın alma siparişiyle ilgili tüm bilgileri içerir: müşteri bilgileri, sipariş edilen maddeler, sevkiyat bilgileri vb.
<?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-0100</Phone>
</Shippers>
<Shippers>
<ShipperID>2</ShipperID>
<CompanyName>United Package</CompanyName>
<Phone>(503) 555-0101</Phone>
</Shippers>
<Shippers>
<ShipperID>3</ShipperID>
<CompanyName>Federal Shipping</CompanyName>
<Phone>(503) 555-0102</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>
Önceki XML belgesinde yer alan satınalma siparişi bilgilerini işlemenin bir adımı, siparişin şirketin geçerli envanterinden doldurulmasıdır. Şirketin ambarından siparişi doldurmaktan sorumlu çalışanın satın alma siparişinin içeriğinin tamamını görmesi gerekmez; yalnızca siparişin ürün bilgilerini görmeleri gerekir. Yalnızca XML belgesinden ürün bilgilerini kullanıma açmak için, XML Şema tanım dili (XSD) şeması olarak yazılmış ve sipariş edilen ürünlerle ve miktarlarla eşlenen bir şemayla kesin olarak yazılmış bir DataSet oluşturun. Kesin olarak yazılan DataSet nesneleri hakkında daha fazla bilgi için bkz . Yazılan Veri Kümeleri.
Aşağıdaki kod, bu örnek için kesin olarak yazılan DataSet'in oluşturulduğu şemayı gösterir.
<?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 şemasına yalnızca özgün XML belgesinin OrderDetails ve Products öğelerindeki bilgilerin eklendiğini unutmayın. DataSet'in bir XmlDataDocument ile eşitlenmesi, DataSet'e dahil olmayan öğelerin XML belgesinde kalıcı olmasını sağlar.
XML Şemasından (Northwind.FillOrder ad alanıyla) oluşturulan kesin türe sahip DataSet ile, özgün XML belgesinin bir bölümü, DataSet kaynak XML belgesinden yüklenen XmlDataDocument ile eşitlenerek ortaya çıkarılabilir. Şemadan oluşturulan DataSet'in yapı içerdiğine ancak veri içermediğini görebilirsiniz. XML'yi XmlDataDocument'a yüklediğinizde veriler doldurulur. Zaten veri içeren bir DataSet ile eşitlenmiş bir XmlDataDocument yüklemeye çalışırsanız, bir özel durum oluşturulur.
DataSet (ve XmlDataDocument) güncelleştirildikten sonra, XmlDataDocument değiştirilmiş XML belgesini aşağıda gösterildiği gibi DataSet tarafından yoksayılan öğeler yine de bozulmadan yazabilir. Satın alma siparişi senaryosunda, sipariş öğeleri doldurulduktan sonra, değiştirilen XML belgesi sipariş işleminin sonraki adımına (belki de şirketin sevkiyat departmanına) geçirilebilir.
Imports System
Imports System.Data
Imports System.Xml
Imports Northwind.FillOrder
Public class Sample
Public Shared Sub Main()
Dim orderDS As OrderDetail = New OrderDetail
Dim xmlDocument As XmlDataDocument = New XmlDataDocument(orderDS)
xmlDocument.Load("Order.xml")
Dim orderItem As OrderDetail.LineItem
Dim product As OrderDetail.Product
For Each orderItem In orderDS.LineItems
product = orderItem.Product
' Remove quantity from the current stock.
product.UnitsInStock = CType(product.UnitsInStock - orderItem.Quantity, Short)
' If the remaining stock is less than the reorder level, order more.
If ((product.UnitsInStock + product.UnitsOnOrder) < product.ReorderLevel) Then
product.UnitsOnOrder = CType(product.UnitsOnOrder + product.ReorderLevel, Short)
End If
Next
xmlDocument.Save("Order_out.xml")
End Sub
End Class
using System;
using System.Data;
using System.Xml;
using Northwind.FillOrder;
public class Sample
{
public static void Main()
{
OrderDetail orderDS = new OrderDetail();
XmlDataDocument xmlDocument = new XmlDataDocument(orderDS);
xmlDocument.Load("Order.xml");
foreach (OrderDetail.LineItem orderItem in orderDS.LineItems)
{
OrderDetail.Product product = orderItem.Product;
// Remove quantity from the current stock.
product.UnitsInStock = (short)(product.UnitsInStock - orderItem.Quantity);
// If the remaining stock is less than the reorder level, order more.
if ((product.UnitsInStock + product.UnitsOnOrder) < product.ReorderLevel)
product.UnitsOnOrder = (short)(product.UnitsOnOrder + product.ReorderLevel);
}
xmlDocument.Save("Order_out.xml");
}
}