XML에서 데이터 세트 스키마 정보 로드

DataSet의 스키마(테이블, 열, 관계 및 제약 조건)는 프로그래밍 방식으로 정의할 수도 있고, DataAdapterFill 또는 FillSchema 메서드를 사용하여 만들거나 XML 문서에서 로드할 수도 있습니다. XML 문서로부터 DataSet 스키마 정보를 로드하기 위해 DataSetReadXmlSchema 또는 InferXmlSchema 메서드를 사용할 수 있습니다. ReadXmlSchema를 사용하면 XSD(XML 스키마 정의 언어) 스키마가 있는 문서나 인라인 XML 스키마가 있는 XML 문서로부터 DataSet 스키마 정보를 로드하거나 유추할 수 있습니다. InferXmlSchema를 사용하면 지정한 특정 XML 네임스페이스는 무시하고 XML 문서로부터 스키마를 유추할 수 있습니다.

참고 항목

XSD 생성자를 사용하여 메모리 내에 생성된 DataSet(예: 중첩 관계)을 웹 서비스나 XML serialization을 통해 전송할 때는 DataSet의 테이블 순서가 유지되지 않을 수도 있습니다. 따라서 이와 같은 경우에는 DataSet를 받는 사용자가 테이블 순서를 신뢰하지 않아야 합니다. 하지만 메모리 내에 생성하는 대신 전송하는 DataSet의 스키마를 XSD 파일에서 읽는 경우에는 항상 테이블 순서가 유지됩니다.

ReadXmlSchema

데이터는 로드하지 않고 DataSet의 스키마만 XML 문서로부터 로드하려면 DataSetReadXmlSchema 메서드를 사용합니다. ReadXmlSchema 메서드는 XSD(XML 스키마 정의 언어) 스키마를 사용하여 정의한 DataSet 스키마를 만듭니다.

ReadXmlSchema 메서드는 로드할 XML 문서가 포함된 파일 이름, 스트림 또는 XmlReader를 단일 인수로 사용합니다. XML 문서에는 스키마만 있을 수도 있고 데이터가 포함된 XML 요소를 가진 스키마 인라인이 있을 수도 있습니다. 인라인 스키마를 XML 스키마로 작성하는 방법에 대한 자세한 내용은 XSD(XML 스키마) 데이터 세트 관계형 구조를 참조하세요.

ReadXmlSchema로 전달된 XML 문서에 인라인 스키마 정보가 없으면 ReadXmlSchema에서 XML 문서 내의 요소로부터 스키마를 유추합니다. DataSet에 이미 스키마가 있으면 새 테이블을 추가하여(없는 경우) 현재 스키마를 확장합니다. 새 열은 기존 테이블에 추가되지 않습니다. 추가되는 열이 DataSet에 이미 있지만 XML에 있는 열과 형식이 호환되지 않으면 예외가 throw됩니다. ReadXmlSchema에서 XML 문서를 통해 스키마를 유추하는 방법에 대한 자세한 내용은 XML에서 데이터 세트 관계형 구조 유추를 참조하세요.

ReadXmlSchemaDataSet의 스키마만 로드하거나 유추하는 반면, DataSetReadXml 메서드는 XML 문서에 있는 스키마와 데이터를 모두 로드하거나 유추합니다. 자세한 내용은 XML에서 데이터 세트 로드를 참조하세요.

다음 코드 예제에서는 XML 문서나 스트림으로부터 DataSet 스키마를 로드하는 방법을 보여 줍니다. 첫 번째 예제에서는 ReadXmlSchema 메서드로 전달될 XML 스키마 파일 이름을 보여 줍니다. 두 번째 예제에서는 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

DataSetInferXmlSchema 메서드를 사용하여 XML 문서로부터 해당 스키마를 유추하도록 DataSet을 지정할 수도 있습니다. InferXmlSchema는 읽을 문서에 인라인 스키마가 없는 경우 InferSchemaXmlReadMode로 설정된 ReadXml(데이터 로드 및 스키마 유추) 및 ReadXmlSchema와 동일하게 작동합니다. 그러나 InferXmlSchema의 추가 기능을 사용하면 스키마를 유추할 때 무시할 특정 XML 네임스페이스를 지정할 수 있습니다. InferXmlSchema는 두 개의 필수 인수를 사용하는데, 하나는 파일 이름, 스트림 또는 XmlReader로 지정하는 XML 문서의 위치이고 다른 하나는 처리 중 무시될 XML 네임스페이스의 문자열 배열입니다.

예를 들어, 다음과 같은 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>  

이전 XML 문서의 요소에 대해 지정된 특성으로 인해, InferSchemaXmlReadMode로 설정된 ReadXml 메서드와 ReadXmlSchema 메서드는 모두 문서의 모든 요소(Categories, CategoryID, CategoryName, Description, Products, ProductID, ReorderLevelDiscontinued)에 대해 테이블을 만듭니다. (자세한 내용은 XML 데이터 세트 관계형 구조 유추를 참조하세요.) 그러나 보다 적합한 구조는 CategoriesProducts 테이블만을 만든 다음, Categories 테이블에서 CategoryID, CategoryNameDescription 열을 만들고 Products 테이블에 ProductID, ReorderLevelDiscontinued 열을 만듭니다. 유추된 스키마에서 XML 요소에 지정된 특성을 무시하도록 하려면 다음 예제와 같이 InferXmlSchema 메서드를 사용하고 무시할 officedata에 대한 XML 네임스페이스를 지정합니다.

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

참고 항목