2012-01-05 5 views
3

두 개의 문자열이 있습니다. 한 문자열에 XML 데이터가 있고 다른 문자열에 해당 XML 스키마가 있습니다. DataTable에서 데이터를 읽으려고합니다. 불가능한 것처럼 보입니다. 데이터 집합을 사용하고 싶지 않습니다. XML 데이터와 스키마를 메모리 스트림에 결합하여 읽을 수있는 방법이 있습니까?DataTable의 ReadXML 데이터 및 스키마

+0

DaraTable/데이터 세트는 자신의 스키마, 당신은 함께 가져 오지 하나를 이해합니다. 스키마없이 사용해보십시오. –

+0

DataSet이 스키마없이 데이터를 읽을 수있는 것처럼 보입니다. 하지만 내가 datatable 함께 시도하면 다음과 같은 오류가 발생했습니다. Datatable은 xml에서 스키마 유추를 지원하지 않습니다. –

+0

"DataSet에서 데이터를 읽을 수 있습니다"- 문제가 해결 되었습니까? –

답변

4

DataTable의 메서드를 통해 xml을 직접 DataTable에로드하거나 임의의 스키마에서 DataTable을 직접 만들 수있는 방법이 없습니다. 이러한 작업은 DataSet을 통해 수행해야합니다. 그렇지 않으면 매우 복잡한 해결 방법을 수행하게됩니다.

XML 직렬화를 사용하여 이전에 직렬화 된 XML에서 데이터 집합을 다시 만들 수있는 몇 가지 기술이 있습니다. 이것은 임의의 스키마의 사용을 허용하지 않습니다.

XML을 (XDocument, XmlDocument 또는 XmlTextReader를 통해)로드하고 즉시 DataTable을 만드는 코드를 작성할 수도 있지만 작성하기가 쉽지는 않으며 꽤 오랜 시간이 걸릴 것입니다. 그것은 또한 바퀴의 재발 명입니다.

기본적으로 DataSet은 Xml에 여러 테이블을 포함 할 수 있기 때문에 XML을 처리하는 메서드가있는 계층 구조의 유일한 클래스입니다. XML에 대해 거의 가정 할 수없는 가장 광범위한 사례를 처리하려면 해당 수준에서 구현해야합니다.

xml을 XDocument에로드하고 Validate 확장 메소드를 사용하여 유효성 검사를하고 Linq to Xml을 사용하여 유효성을 검사하는 것이 적절한 지 고려해 볼 수 있습니다.

3

XML 데이터와 스키마를 메모리에 결합 할 수있는 방법이 있습니까? 스트림을 읽었습니까?


방법

 static DataTable ParseXML(string xmlString) 
    { 
     DataSet ds = new DataSet(); 
     byte[] xmlBytes = Encoding.UTF8.GetBytes(xmlString); 
     Stream memory = new MemoryStream(xmlBytes); 
     ds.ReadXml(memory); 
     return ds.Tables[0]; 
    } 

예 :

  string xml = new XElement("inventory", 
       new XElement("item", 
        new XElement("name", "rock"), 
        new XElement("price", "5000")), 
       new XElement("item", 
        new XElement("name", "new car"), 
        new XElement("price", "1"))).ToString(); 

      DataTable dt = ParseXML(xml); 
      foreach (DataRow row in dt.Rows) 
      { 
       foreach (DataColumn col in dt.Columns) 
        Console.Write(row[col.ColumnName] + " | "); 

       Console.WriteLine(); 
      }