Udostępnij za pośrednictwem


Ładowanie elementu DataSet z pliku XML

Zawartość ADO.NET DataSet można utworzyć na podstawie strumienia XML lub dokumentu. Ponadto dzięki programowi .NET Framework możesz mieć dużą elastyczność co do tego, jakie informacje są ładowane z kodu XML i jak jest tworzona struktura schematu DataSet lub relacyjna.

Aby wypełnić element DataSet danymi z kodu XML, użyj metody DataSet ReadXml obiektu. Metoda ReadXml odczytuje z pliku, strumienia lub elementu XmlReader i przyjmuje jako argumenty źródło kodu XML oraz opcjonalny argument XmlReadMode. Aby uzyskać więcej informacji na temat elementu XmlReader, zobacz Odczytywanie danych XML przy użyciu elementu XmlTextReader. Metoda ReadXml odczytuje zawartość strumienia XML lub dokumentu i ładuje element z DataSet danymi. Spowoduje to również utworzenie schematu DataSet relacyjnego elementu w zależności od określonego elementu XmlReadMode i tego, czy schemat relacyjny już istnieje.

W poniższej tabeli opisano opcje argumentu XmlReadMode .

Opcja Opis
Auto Jest to opcja domyślna. Sprawdza kod XML i wybiera najbardziej odpowiednią opcję w następującej kolejności:

- Jeśli xml jest DiffGram, diffGram jest używany.
— Jeśli element DataSet zawiera schemat lub kod XML zawiera schemat wbudowany, jest używana funkcja ReadSchema .
- Jeśli DataSet obiekt nie zawiera schematu, a kod XML nie zawiera schematu wbudowanego, jest używana funkcja InferSchema .

Jeśli znasz format odczytywanego kodu XML, aby uzyskać najlepszą wydajność, zaleca się ustawienie jawnego elementu XmlReadMode, a nie akceptowanie wartości domyślnej auto .
ReadSchema Odczytuje dowolny schemat wbudowany i ładuje dane i schemat.

DataSet Jeśli schemat zawiera już schemat, nowe tabele są dodawane ze schematu wbudowanego do istniejącego schematu DataSetw pliku . Jeśli w schemacie wbudowanym istnieją już jakiekolwiek tabele, DataSetzostanie zgłoszony wyjątek. Nie będzie można zmodyfikować schematu istniejącej tabeli przy użyciu elementu XmlReadMode.ReadSchema.

Jeśli schemat DataSet nie zawiera schematu i nie ma wbudowanego schematu, żadne dane nie są odczytywane.

Schemat wbudowany można zdefiniować przy użyciu schematu języka definicji schematu XML (XSD). Aby uzyskać szczegółowe informacje na temat pisania schematu wbudowanego jako schematu XML, zobacz Wyprowadzanie struktury relacyjnej zestawu danych ze schematu XML (XSD).
IgnorujSchema Ignoruje dowolny schemat wbudowany i ładuje dane do istniejącego DataSet schematu. Wszystkie dane, które nie pasują do istniejącego schematu, zostaną odrzucone. Jeśli w elemecie DataSetnie istnieje żaden schemat, żadne dane nie są ładowane.

Jeśli dane są diffGram, IgnoreSchema ma takie same funkcje jak DiffGram .
InferSchema Ignoruje dowolny schemat wbudowany i wywnioskuje schemat zgodnie ze strukturą danych XML, a następnie ładuje dane.

DataSet Jeśli schemat zawiera już schemat, bieżący schemat zostanie rozszerzony przez dodanie kolumn do istniejących tabel. Dodatkowe tabele nie zostaną dodane, jeśli nie ma istniejących tabel. Wyjątek jest zgłaszany, jeśli wywnioskowana tabela już istnieje z inną przestrzenią nazw lub jeśli jakiekolwiek wywnioskowane kolumny powodują konflikt z istniejącymi kolumnami.

Aby uzyskać szczegółowe informacje na temat sposobu wnioskowania schematu ze schematu z dokumentu XML, zobacz Wnioskowanie struktury relacyjnej zestawu danych z pliku XML.
DiffGram Odczytuje diffGram i dodaje dane do bieżącego schematu. DiffGram scala nowe wiersze z istniejącymi wierszami, w których pasują unikatowe wartości identyfikatora. Zobacz "Scalanie danych z xml" na końcu tego tematu. Aby uzyskać więcej informacji na temat diffGrams, zobacz DiffGrams.
Fragment Kontynuuje odczytywanie wielu fragmentów XML do końca strumienia. Fragmenty zgodne ze schematem DataSet są dołączane do odpowiednich tabel. Fragmenty niezgodne ze schematem DataSet są odrzucane.

Uwaga

Jeśli przekażesz element XmlReader do elementu ReadXml , który jest umieszczony w sposobie w dokumencie XML, readXml odczyta go do następnego węzła elementu i będzie traktować go jako element główny, odczytując tylko na końcu węzła elementu. Nie ma to zastosowania w przypadku określenia elementu XmlReadMode.Fragment.

Jednostki DTD

Jeśli kod XML zawiera jednostki zdefiniowane w schemacie definicji typu dokumentu (DTD), w przypadku próby załadowania DataSet elementu zostanie zgłoszony wyjątek, przekazując nazwę pliku, strumień lub nieważny element XmlReader do readXml. Zamiast tego należy utworzyć element XmlValidatingReader z ustawioną wartością EntityHandling.ExpandEntities i przekazać element XmlValidatingReader do elementu ReadXml. Element XmlValidatingReader rozszerzy jednostki przed odczytaniem przez element DataSet.

W poniższych przykładach kodu pokazano, jak załadować element DataSet ze strumienia XML. W pierwszym przykładzie pokazano nazwę pliku przekazywaną do metody ReadXml . W drugim przykładzie pokazano ciąg zawierający kod XML ładowany przy użyciu elementu StringReader.

Dim dataSet As DataSet = New DataSet  
dataSet.ReadXml("input.xml", XmlReadMode.ReadSchema)  
DataSet dataSet = new DataSet();  
dataSet.ReadXml("input.xml", XmlReadMode.ReadSchema);  
Dim dataSet As DataSet = New DataSet  
Dim dataTable As DataTable = New DataTable("table1")  
dataTable.Columns.Add("col1", Type.GetType("System.String"))  
dataSet.Tables.Add(dataTable)  
  
Dim xmlData As String = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>"  
  
Dim xmlSR As System.IO.StringReader = New System.IO.StringReader(xmlData)  
  
dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema)  
DataSet dataSet = new DataSet();  
DataTable dataTable = new DataTable("table1");  
dataTable.Columns.Add("col1", typeof(string));  
dataSet.Tables.Add(dataTable);  
  
string xmlData = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>";  
  
System.IO.StringReader xmlSR = new System.IO.StringReader(xmlData);  
  
dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);  

Uwaga

Jeśli wywołasz metodę ReadXml , aby załadować bardzo duży plik, może wystąpić niska wydajność. Aby zapewnić najlepszą wydajność dla funkcji ReadXml, w dużym pliku wywołaj metodę BeginLoadData dla każdej tabeli w DataSetpliku , a następnie wywołaj metodę ReadXml. Na koniec wywołaj EndLoadData każdą tabelę DataSetw tabeli , jak pokazano w poniższym przykładzie.

Dim dataTable As DataTable  
  
For Each dataTable In dataSet.Tables  
   dataTable.BeginLoadData()  
Next  
  
dataSet.ReadXml("file.xml")  
  
For Each dataTable in dataSet.Tables  
   dataTable.EndLoadData()  
Next  
foreach (DataTable dataTable in dataSet.Tables)  
   dataTable.BeginLoadData();  
  
dataSet.ReadXml("file.xml");
  
foreach (DataTable dataTable in dataSet.Tables)  
   dataTable.EndLoadData();  

Uwaga

Jeśli schemat XSD dla elementu DataSet targetNamespace zawiera element targetNamespace, dane mogą nie być odczytywane i mogą wystąpić wyjątki, podczas wywoływania polecenia ReadXml w celu załadowania pliku DataSet XML zawierającego elementy bez kwalifikowanej przestrzeni nazw. Aby odczytać niekwalifikowane elementy w tym przypadku, ustaw elementFormDefault równy "kwalifikowany" w schemacie XSD. Na przykład:

<xsd:schema id="customDataSet"
  elementFormDefault="qualified"  
  targetNamespace="http://www.tempuri.org/customDataSet.xsd"
  xmlns="http://www.tempuri.org/customDataSet.xsd"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">  
</xsd:schema>  

Scalanie danych z pliku XML

DataSet Jeśli obiekt zawiera już dane, nowe dane z pliku XML są dodawane do danych znajdujących się już w pliku DataSet. ReadXml nie scala z pliku XML z DataSet żadnymi informacjami o wierszu z pasującymi kluczami podstawowymi. Aby zastąpić istniejące informacje o wierszu nowymi informacjami z kodu XML, użyj narzędzia ReadXml , aby utworzyć nowy DataSetelement , a następnie Merge nowy DataSet w istniejącym DataSetpliku . Należy pamiętać, że ładowanie diffGramu przy użyciu narzędzia ReadXML z elementem XmlReadMode diffGram spowoduje scalenie wierszy, które mają ten sam unikatowy identyfikator.

Zobacz też