Dela via


Läsa in datauppsättningsschemainformation från XML

Schemat för en DataSet (dess tabeller, kolumner, relationer och begränsningar) kan definieras programmatiskt, skapas med fyllnings- eller FillSchema-metoderna i ett DataAdapter, eller läsas in från ett XML-dokument. Om du vill läsa in DataSet-schemainformation från ett XML-dokument kan du använda metoden ReadXmlSchema eller InferXmlSchema i DataSet. Med ReadXmlSchema kan du läsa in eller härleda DataSet-schemainformation från dokumentet som innehåller XSD-schemaschemat (XML Schema Definition Language) eller ett XML-dokument med infogat XML-schema. Med InferXmlSchema kan du härleda schemat från XML-dokumentet samtidigt som du ignorerar vissa XML-namnområden som du anger.

Kommentar

Tabellordning i en DataSet kanske inte bevaras när du använder webbtjänster eller XML-serialisering för att överföra en DataSet som skapades i minnet med hjälp av XSD-konstruktioner (till exempel kapslade relationer). Därför bör mottagaren av DataSet inte vara beroende av tabellordning i det här fallet. Tabellordning bevaras dock alltid om schemat för datauppsättningen som överförs lästes från XSD-filer i stället för att skapas i minnet.

ReadXmlSchema

Om du vill läsa in schemat för en DataSet från ett XML-dokument utan att läsa in några data kan du använda metoden ReadXmlSchema för DataSet. ReadXmlSchema skapar ett DataSet-schema som definierats med hjälp av XSD-schemat (XML Schema Definition Language).

Metoden ReadXmlSchema använder ett enda argument med ett filnamn, en dataström eller en XmlReader som innehåller XML-dokumentet som ska läsas in. XML-dokumentet kan bara innehålla schema eller innehålla schema infogade med XML-element som innehåller data. Mer information om hur du skriver infogat schema som XML-schema finns i Härleda datauppsättningens relationsstruktur från XML-schema (XSD).

Om XML-dokumentet som skickas till ReadXmlSchema inte innehåller någon infogad schemainformation kommer ReadXmlSchema att härleda schemat från elementen i XML-dokumentet. Om DataSet redan innehåller ett schema utökas det aktuella schemat genom att lägga till nya tabeller om de inte redan finns. Nya kolumner läggs inte till i befintliga tabeller. Om en kolumn som läggs till redan finns i DataSet men har en inkompatibel typ med kolumnen som finns i XML:en genereras ett undantag. Mer information om hur ReadXmlSchema härleder ett schema från ett XML-dokument finns i Härleda DataSet Relationsstruktur från XML.

ReadXmlSchema läser in eller härleder endast schemat för en DataSet, men Metoden ReadXml för DataSet läser in eller härleder både schemat och data som finns i XML-dokumentet. Mer information finns i Läsa in en DataSet från XML.

Följande kodexempel visar hur du läser in ett DataSet-schema från ett XML-dokument eller en dataström. I det första exemplet visas ett XML-schemafilnamn som skickas till metoden ReadXmlSchema . Det andra exemplet visar en 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

Du kan också instruera DataSet att härleda dess schema från ett XML-dokument med hjälp av metoden InferXmlSchema i DataSet. InferXmlSchema fungerar på samma sätt som både ReadXml med en XmlReadMode av InferSchema (läser in data samt härleder schema) och ReadXmlSchema om dokumentet som läses inte innehåller något infogat schema. InferXmlSchema ger dock den ytterligare möjligheten att tillåta att du anger specifika XML-namnområden som ska ignoreras när schemat härleds. InferXmlSchema tar två obligatoriska argument: platsen för XML-dokumentet, som anges med ett filnamn, en dataström eller en XmlReader, och en strängmatris med XML-namnområden som ska ignoreras av åtgärden.

Tänk till exempel på följande 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>  

På grund av de attribut som angetts för elementen i föregående XML-dokument skulle både metoden ReadXmlSchema och Metoden ReadXml med xmlReadMode i InferSchema skapa tabeller för varje element i dokumentet: Categories, CategoryID, CategoryName, Description, Products, ProductID, ReorderLevel och Discontinued. (Mer information finns i Härleda datauppsättningens relationsstruktur från XML.) En lämpligare struktur skulle dock vara att endast skapa tabellerna Kategorier och Produkter och sedan skapa kolumnerna CategoryID, CategoryName och Description i tabellen Kategorier, och kolumnerna ProductID, ReorderLevel och Discontinued i tabellen Produkter. För att säkerställa att det här schemat ignorerar de attribut som anges i XML-elementen använder du metoden InferXmlSchema och anger XML-namnområdet för officedata som ska ignoreras, som du ser i följande exempel.

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");  

Se även