允许通过相关的 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 数据,并使用 W3C 文档对象模型 (DOM) 操作这些数据。DOM 将数据显示为节点对象层次结构。由于 XmlDataDocument 实现 IXPathNavigable 接口,因此它还可用作 XslTransform 类的源文档。

XmlDataDocumentDataSet 类有密切的从属关系,后者提供所加载的 XML 数据的关系视图。对 XmlDataDocument 所做的任何更改都将反映在 DataSet 中,反之亦然。

若要将 XML 数据加载到 DataSet 中,请使用 ReadXmlSchema 生成关系映射。然后,可以使用 LoadLoadXml 加载 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();
用指定的 DataSet 初始化 XmlDataDocument 类的新实例。
[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。随后的示例将创建具有最小化架构的 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>
<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 文档包含的订单信息时,其中一个步骤是利用公司当前的库存来为订单供货。负责从公司仓库中给订单供货的职员不需要查看订单的全部内容,他们只需要查看该订单的产品信息。若要仅从 XML 文档中公开产品信息,可创建一个强类型 DataSet,该 DataSet 以 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 文档的 OrderDetailsProducts 元素的信息。通过使 DataSetXmlDataDocument 同步,可确保未包含在 DataSet 中的元素保持在 XML 文档中。

利用从 XML 架构(命名空间为 Northwind.FillOrder)生成的强类型 DataSet,可以通过使 DataSet 与从源 XML 文档中加载的 XmlDataDocument 同步来公开初始 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");
}
}