Абстрагирование структур данных хранилища в XPath
Вопрос
У меня есть коллекция данных, хранящихся в XDocuments и DataTables, и я хотел бы обратиться к обоим как к единому унифицированному пространству данных с запросами XPath.Так, например, "/Root/Tables/Orders/FirstName" будет извлекать значение столбца Firstname в каждой строке таблицы данных с именем "Orders".
Есть ли способ сделать это без копирования всех записей в DataTable в XDocument?
Я использую .Net 3.5
Решение 2
В конце концов я сам нашел ответ на этот вопрос.Я обнаружил класс в System.Xml.LINQ под названием XStreamingElement, который может создавать XML-структуру "на лету" из выражения LINQ.Вот пример приведения DataTable в XML-пространство.
Dictionary<string,DataTable> Tables = new Dictionary<string,DataTable>();
// ... populate dictionary of tables ...
XElement TableRoot = new XStreamingElement("Tables",
from t in Tables
select new XStreamingElement(t.Key,
from DataRow r in t.Value.Rows
select new XStreamingElement("row",
from DataColumn c in t.Value.Columns
select new XElement(c.ColumnName, r[c])))))
Результатом является XElement (TableRoot) со структурой, подобной приведенной ниже, при условии, что словарь содержит одну таблицу под названием "Orders" с двумя строками.
<Tables>
<Orders>
<row>
<sku>12345</sku>
<quantity>2</quantity>
<price>5.95</price>
</row>
<row>
<sku>54321</sku>
<quantity>3</quantity>
<price>2.95</price>
</row>
</Orders>
</Tables>
Это может быть объединено с более крупной иерархией на основе XElement / XDocument и запрошено с помощью XPath.
Другие советы
.NETs XPath работает на IXPathNavigable интерфейсе.Каждый IXPathNavigable имеет метод CreateNavigator(), который возвращает IXPathNavigator.
Чтобы представить все ваши источники данных в виде одного большого документа, вам нужно было бы создать класс, реализующий IXPathNavigable, содержащий все источники данных xpath.Метод CreateNavigator должен возвращать пользовательский XPathNavigator, который предоставляет содержимое как один большой источник данных.
К сожалению, реализация этого навигатора несколько затруднительна, и необходимо соблюдать осторожность, особенно при переходе между документами,
Вы ищете что-то похожее на то, о чем я спрашивал Внешние ключи XPath?
Как говорится в рекомендации XPath, "Основная цель XPath - обращаться к частям XML-документа". В нем нет никаких средств для обращения к частям более чем одного XML-документа.Вам придется создать единый XML-документ, если вы хотите сделать то, что пытаетесь сделать.
Вам придется объединить свои документы или, по крайней мере, выполнить одинаковые преобразования для всех ваших документов.Вы можете рассмотреть возможность перемещения ваших документов в одну таблицу данных, а затем фильтрации таблицы данных, если XPath / XSLT недоступен.