Можно ли запросить XML-файл с помощью SQL? - PullRequest
3 голосов
/ 26 апреля 2010

В настоящее время я работаю над случаем, когда мы не хотим сильно менять программу на c # / wpf, но хотели бы добавить функцию. В настоящее время мы разрешаем определенным пользователям добавлять sql-запросы в базу данных для извлечения данных о клиентах, при этом необходимо указать пользовательскую строку подключения / имя поставщика. С помощью этой информации можно создать соединение и получить данные с помощью c #.

Однако мы хотели бы добавить возможность разрешать этой группе пользователей также запрашивать XML-файлы с определенной строкой соединения / именем поставщика. Я только что искал возможности сделать это в .net, но не могу найти приличного пути ... Возможно ли что-то подобное? (Может быть OleDb / ODBC?)

edit: Для ясности я хотел бы заявить, что решение должно быть в состоянии вписаться в шаблон соединения источника данных с указанной строкой соединения, с указанным поставщиком и выполнить SQL-запрос.

edit2: просмотрев первые три ответа, я решил взглянуть не только на XML. Этот пост, кажется, лучше иллюстрирует приведенный выше случай (единственное отличие состоит в том, что вместо XML используется XLS): Как запросить файл Excel в C # с помощью подробного запроса . Тем не менее, возможные решения с использованием XML по-прежнему приветствуются ...

Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 26 апреля 2010

Да. использовать Linq2Xml

http://www.hookedonlinq.com/LINQtoXML5MinuteOverview.ashx

http://www.liquidcognition.com/tech-tidbits/linq2xml-example.aspx

// Loading from a file, you can also load from a stream
XDocument loaded = XDocument.Load(@"C:\contacts.xml");


// Query the data and write out a subset of contacts
var q = from c in loaded.Descendants("contact")
        where (int)c.Attribute("contactId") < 4
        select (string)c.Element("firstName") + “ “ +
      (string)c.Element("lastName");


foreach (string name in q)
    Console.WriteLine("Customer name = {0}", name);
1 голос
/ 26 апреля 2010

AFAIK, вы не можете использовать стандартные SQL-операторы для XML. Но то, что вы можете использовать, это XQuery. Это язык запросов для XML-документов.

http://en.wikipedia.org/wiki/XQuery
http://www.w3schools.com/xquery/default.asp

НТН

0 голосов
/ 26 апреля 2010

Многие библиотеки XML позволяют отправлять запросы XPath к документу XML, но синтаксис сильно отличается от SQL, а семантика сильно отличается. Кроме того, XPath на самом деле не создает наборы результатов так, как SQL - он возвращает части документа XML или содержимое полей. Я бы сказал, что вы, вероятно, столкнетесь со значительным несоответствием импеданса, если остальная часть приложения будет ориентирована на наборы результатов SQL.

XPath также намного тупее, чем SQL, хотя есть и другой язык (XQuery), который гораздо умнее. Тем не менее, хорошая поддержка XQuery гораздо реже встречается в библиотеках синтаксического анализа XML. XQuery работает совсем не так, как SQL, поэтому у ваших пользователей могут возникнуть проблемы с его пониманием.

Многие платформы СУБД (включая SQL Server) также имеют собственный тип данных XML, который поддерживает встраивание выражений Xpath в запросы SQL. Используя CROSS APPLY, вы можете выполнять операции объединения, чтобы сгладить иерархические структуры данных в наборе результатов SQL. Тем не менее, это довольно неудобно, и у ваших пользователей могут возникнуть проблемы с его корректной работой.

Короче говоря, я думаю, что добавление такого рода средств для запроса XML-документов, вероятно, будет работать не очень хорошо.

Одним из вариантов может быть создание средства, которое уничтожает документы XML и заполняет содержимое в базе данных с той же структурой, что и ваше приложение. Это достаточно просто реализовать и не потребует от ваших пользователей изучения новой парадигмы.

0 голосов
/ 26 апреля 2010

Linq - это язык, похожий на SQL для .NET, который позволяет вам писать операторы в стиле SQL для запросов многих вещей. Он специально позволяет вам делать это для документов XML.

Эта статья содержит довольно хороший обзор Linq to XML.

Вот пример того, как это выглядит / работает

var q = from c in xmlSource.contact
        where c.contactId < 4
        select c.firstName + " " + c.lastName;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...