Абстрагирование структур данных хранения в XPath - PullRequest
1 голос
/ 29 сентября 2008

У меня есть коллекция данных, хранящихся в XDocuments и DataTables, и я хотел бы обратиться к обоим как к единому пространству данных с запросами XPath. Так, например, «/ Root / Tables / Orders / FirstName» будет извлекать значение столбца Firstname в каждой строке таблицы данных с именем «Orders».

Есть ли способ сделать это без копирования всех записей в DataTable в XDocument?

Я использую .Net 3.5

Ответы [ 5 ]

1 голос
/ 22 октября 2008

Я со временем разобрался с ответом на это сам. Я обнаружил в 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.

1 голос
/ 06 октября 2008

.NET XPath работает на интерфейсе IXPathNavigable. Каждый IXPathNavigable имеет метод CreateNavigator (), который возвращает IXPathNavigator.

Чтобы представить все ваши источники данных как один большой документ, вам необходимо создать класс, реализующий IXPathNavigable, содержащий все источники данных xpath. Метод CreateNavigator должен возвращать пользовательский XPathNavigator, который представляет содержимое как один большой источник данных.

К сожалению, реализация этого навигатора несколько затруднительна, и необходимо соблюдать осторожность, особенно при переходе между документами,

0 голосов
/ 30 сентября 2008

Как говорится в рекомендации XPath: «Основная цель XPath - обращаться к частям XML-документа». Он не имеет возможности обращаться к частям более одного XML-документа. Вам придется создать один XML-документ, если вы хотите делать то, что пытаетесь сделать.

0 голосов
/ 30 сентября 2008

Вам придется объединить ваши документы или, по крайней мере, выполнить одинаковые преобразования для всех ваших документов. Вы можете переместить ваши документы в одну таблицу DataTable, а затем отфильтровать таблицу DataTable, если XPath / XSLT невозможен.

0 голосов
/ 29 сентября 2008

Вы ищете что-то похожее на то, что я спросил относительно внешних ключей XPath ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...