Абстрагирование структур данных хранилища в XPath

StackOverflow https://stackoverflow.com/questions/150084

  •  02-07-2019
  •  | 
  •  

Вопрос

У меня есть коллекция данных, хранящихся в 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 недоступен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top