Udostępnij przez


Ładowanie informacji o schemacie zestawu danych z pliku XML

Schemat (DataSet, jego tabele, kolumny, relacje i ograniczenia) można zdefiniować programowo, utworzony przez metody Fill lub FillSchema albo DataAdapter, albo wczytany z dokumentu XML. Aby załadować DataSet informacje o schemacie z dokumentu XML, możesz użyć albo ReadXmlSchema albo InferXmlSchema metody DataSet. ReadXmlSchema Umożliwia ładowanie lub wnioskowanie DataSet informacji o schemacie z dokumentu zawierającego schemat definicji schematu XML (XSD) lub dokument XML ze wbudowanym schematem XML. InferXmlSchema Umożliwia wnioskowanie schematu z dokumentu XML przy jednoczesnym ignorowaniu określonych przestrzeni nazw XML.

Uwaga / Notatka

Kolejność tabel w obiekcie DataSet może nie zostać zachowana, gdy używasz usług webowych lub serializacji XML do transferu obiektu DataSet, który został utworzony w pamięci przy użyciu konstrukcji XSD (takich jak relacje zagnieżdżone). W związku z tym odbiorca obiektu DataSet nie powinien zależeć od kolejności tabeli w tym przypadku. Jednak kolejność tabel jest zawsze zachowywana, jeśli schemat przesyłanego DataSet pliku został odczytany z plików XSD, a nie tworzony w pamięci.

OdczytXmlSchema

Aby załadować schemat DataSet elementu z dokumentu XML bez ładowania żadnych danych, możesz użyć ReadXmlSchema metody zestawu danych. ReadXmlSchema Tworzy DataSet schemat zdefiniowany przy użyciu schematu języka definicji schematu XML (XSD).

Metoda ReadXmlSchema przyjmuje jeden argument nazwy pliku, strumienia lub XmlReader zawierającego dokument XML do załadowania. Dokument XML może zawierać tylko schemat lub może zawierać schemat wbudowany z elementami XML zawierającymi dane. Aby uzyskać szczegółowe informacje na temat pisania schematu wbudowanego jako schematu XML, zobacz Wyprowadzanie struktury relacyjnej zestawu danych ze schematu XML (XSD).

Jeśli przekazany dokument ReadXmlSchema XML nie zawiera informacji o schemacie wbudowanym, ReadXmlSchema wywnioskuje schemat z elementów w dokumencie XML. DataSet Jeśli schemat już istnieje, bieżący schemat zostanie rozszerzony przez dodanie nowych tabel, jeśli jeszcze nie istnieją. Nowe kolumny nie zostaną dodane do istniejących tabel. Jeśli dodawana kolumna już istnieje w obiekcie DataSet , ale ma niezgodny typ z kolumną znalezioną w kodzie XML, zgłaszany jest wyjątek. Aby uzyskać szczegółowe informacje na temat wnioskowania ReadXmlSchema schematu z dokumentu XML, zobacz Wnioskowanie struktury relacyjnej zestawu danych z formatu XML.

Mimo że ReadXmlSchema ładuje lub wywnioskuje tylko schemat zestawu danych, metoda ReadXmlDataSet ładuje i wywnioskuje zarówno schemat, jak i dane zawarte w dokumencie XML. Aby uzyskać więcej informacji, zobacz Ładowanie zestawu danych z pliku XML.

W poniższych przykładach kodu pokazano, jak załadować DataSet schemat z dokumentu XML lub strumienia. W pierwszym przykładzie pokazano, jak nazwa pliku schematu XML jest przekazywana do metody ReadXmlSchema. Drugi przykład przedstawia element System.IO.StreamReader.

Dim dataSet As DataSet = New DataSet
dataSet.ReadXmlSchema("schema.xsd")
DataSet dataSet = new DataSet();
dataSet.ReadXmlSchema("schema.xsd");
Dim xmlStream As New System.IO.StreamReader("schema.xsd")
Dim dataSet As DataSet = New DataSet
dataSet.ReadXmlSchema(xmlStream)
xmlStream.Close()
System.IO.StreamReader xmlStream = new System.IO.StreamReader("schema.xsd");
DataSet dataSet = new DataSet();
dataSet.ReadXmlSchema(xmlStream);
xmlStream.Close();

InferXmlSchema

Możesz również polecić DataSet wnioskowanie jego schematu z dokumentu XML przy użyciu metody InferXmlSchema obiektu DataSet. InferXmlSchema działa w taki sam sposób jak zarówno ReadXml z XmlReadModeInferSchema (ładuje dane i wnioskuje schemat) oraz ReadXmlSchema, jeśli odczytywany dokument nie zawiera schematu wbudowanego. InferXmlSchema Zapewnia jednak dodatkową możliwość określania określonych przestrzeni nazw XML, które mają być ignorowane, gdy schemat zostanie wywnioskowany. InferXmlSchema przyjmuje dwa wymagane argumenty: lokalizację dokumentu XML, określoną przez nazwę pliku, strumień lub element XmlReader; oraz tablica ciągów przestrzeni nazw XML, które mają być ignorowane przez operację.

Rozważmy na przykład następujący kod XML:

<NewDataSet xmlns:od="urn:schemas-microsoft-com:officedata">
<Categories>
  <CategoryID od:adotype="3">1</CategoryID>
  <CategoryName od:maxLength="15" od:adotype="130">Beverages</CategoryName>
  <Description od:adotype="203">Soft drinks and teas</Description>
</Categories>
<Products>
  <ProductID od:adotype="20">1</ProductID>
  <ReorderLevel od:adotype="3">10</ReorderLevel>
  <Discontinued od:adotype="11">0</Discontinued>
</Products>
</NewDataSet>

Ze względu na atrybuty określone dla elementów w poprzednim dokumencie XML, zarówno metoda ReadXmlSchema, jak i metoda ReadXml z XmlReadMode na InferSchema tworzy tabele dla każdego elementu w dokumencie: Categories, CategoryID, CategoryName, Description, Products, ProductID, ReorderLevel i Discontinued. (Aby uzyskać więcej informacji, zobacz Inferring DataSet Relational Structure from XML (Wnioskowanie struktury relacyjnej zestawu danych z pliku XML)). Jednak bardziej odpowiednią strukturą byłoby utworzenie tylko tabel Categories i Products, a następnie utworzenie kolumn CategoryID, CategoryName i Description w Categories tabeli oraz kolumn ProductID, ReorderLevel i Discontinued w tabeli Products. Aby upewnić się, że wywnioskowany schemat ignoruje atrybuty określone w elementach XML, użyj metody InferXmlSchema i określ przestrzeń nazw XML, którą należy zignorować dla officedata, jak pokazano w poniższym przykładzie.

Dim dataSet As DataSet = New DataSet
dataSet.InferXmlSchema("input_od.xml", New String() {"urn:schemas-microsoft-com:officedata"})
DataSet dataSet = new DataSet();
dataSet.InferXmlSchema("input_od.xml", new string[] "urn:schemas-microsoft-com:officedata");

Zobacz także