Данные ReadXML и Схема в DataTable - PullRequest
3 голосов
/ 05 января 2012

У меня есть две строки. Одна строка содержит XML-данные, а другая строка имеет соответствующую XML-схему. Я пытаюсь прочитать данные в DataTable. Похоже, это невозможно. Я не хочу использовать набор данных. Есть ли способ объединить данные XML и схему в поток памяти и прочитать?

Ответы [ 2 ]

4 голосов
/ 28 февраля 2012

Проще говоря, нет, нет способа загрузить XML непосредственно в DataTable с помощью методов DataTable, равно как и нет способа создать DataTable непосредственно из произвольной схемы. Такие операции должны выполняться через DataSet; в противном случае вы в конечном итоге делаете очень сложные обходные пути.

Существуют некоторые методы, которые вы можете применить, используя сериализацию xml, которые могли бы воссоздать набор данных из ранее сериализованного xml. Это не позволяет использовать произвольную схему.

Вы также можете написать код, специально загружающий ваш XML (через XDocument, XmlDocument или XmlTextReader) и создающий DataTable на лету, но писать его нетривиально и, вероятно, это займет у вас довольно много времени. Это также своего рода изобретать колесо.

По сути, DataSet является единственным классом в этой иерархии с методами для обработки XML, поскольку Xml может содержать любое количество таблиц. Чтобы справиться с самым широким числом случаев, когда вы почти не можете делать предположений относительно XML, он должен быть реализован на этом уровне.

Вы также можете подумать, уместно ли просто загрузить xml в XDocument, проверить его с помощью метода расширения Validate и использовать Linq to Xml для его запроса.

3 голосов
/ 28 февраля 2012

Есть ли способ объединить данные 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();
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...