本節示範在處理採購訂單過程中,如何使用一個與 DataSet 同步的強類型XmlDataDocument步驟。 以下範例會建立一個最小化的 DataSet 結構,僅與原始 XML 文件的一部分相符。 範例中使用 , XmlDataDocument 以保留原始 XML 文件的忠實度,使得 可用 DataSet 來揭露 XML 文件的子集。
下列 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>
<ShipCountryOrRegion>Switzerland</ShipCountryOrRegion>
</Orders>
<CompanyName>Chop-suey Chinese</CompanyName>
<ContactName>Yang Wang</ContactName>
<ContactTitle>Owner</ContactTitle>
<Address>Hauptstr. 29</Address>
<City>Bern</City>
<PostalCode>3012</PostalCode>
<CountryOrRegion>Switzerland</CountryOrRegion>
<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>
處理上述 XML 檔中所含採購單資訊的其中一個步驟,就是要從公司目前的庫存填滿訂單。 負責填寫公司倉庫訂單的員工不需要查看採購單的全部內容:他們只需要查看訂單的產品資訊。 若要僅暴露 XML 文件中的產品資訊,請建立一個強型別 DataSet ,並以 XML Schema 定義語言(XSD)架構撰寫,映射到訂購的產品與數量。 欲了解更多關於強型別化 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>
請注意,OrderDetails 的結構中僅包含原始 XML 文件 和 Products 元素的資訊。 將 DataSet 與 XmlDataDocument 同步,確保未包含在 DataSet 的元素會保留在 XML 文件中。
透過具有命名空間 DataSet 的 XML 架構生成的強型別 ,可通過將 DataSet 同步至從來源 XML 文檔載入的 XmlDataDocument,來暴露原始 XML 文件的部分內容。 從結構產生的檔案 DataSet 包含結構,但沒有資料。 當您將 XML 載入 XmlDataDocument 時,就會填入數據。 如果您嘗試載入一個已經與含有資料的 DataSet 同步的 XmlDataDocument,將會拋出異常。
在DataSet(以及XmlDataDocument)更新後,XmlDataDocument就可以寫出修改後的 XML 文件,並保留DataSet忽略的元素,如下所示。 在採購單案例中,訂單項目已完成之後,修改過的 XML 檔案接著可以傳遞至訂單流程中的下一個步驟,可能是公司的運輸部門。
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");
}
}
另請參閱
- DataSet 和 XmlDataDocument 同步處理
- ADO.NET 概觀