Преобразование наборов результатов SQL в XML - PullRequest
3 голосов
/ 17 сентября 2008

Я ищу инструмент, который может сериализовать и / или преобразовывать наборы результатов SQL в XML. Изучить генерацию XML из результирующих наборов SQL просто и тривиально, но это не то, что мне нужно.

Решение должно быть нейтральным к базе данных и принимать только обычные результаты SQL-запросов (без поддержки db xml). Особая задача этого инструмента - предоставить вложенный XML, соответствующий любой схеме из результатов на основе строк. Промежуточные шаги слишком медленны и расточительны - это должно произойти за один шаг; нет RS-> объект-> XML, предпочтительно нет RS-> XML-> XSLT-> XML. Он должен поддерживать потоковую передачу из-за больших наборов результатов, большого XML.

Есть что-нибудь для этого?

Ответы [ 8 ]

2 голосов
/ 18 сентября 2008

С SQL Server вы действительно должны рассмотреть использование конструкции FOR XML в запросе.

Если вы используете .Net, просто используйте DataAdapter для заполнения набора данных. Когда он окажется в наборе данных, просто используйте его метод .WriteXML (). Это нарушает ваше правило DB-> object-> XML, но это действительно так. Возможно, вам удастся что-то решить с устройством чтения данных, но я сомневаюсь в этом.

2 голосов
/ 18 сентября 2008

В .NET вы можете заполнить набор данных из любого источника, а затем записать его на диск в виде XML со схемой или без нее. Я не могу сказать, какой будет производительность для больших сетов. Просто:)

2 голосов
/ 17 сентября 2008

Не то, что я знаю. Я бы просто свернул свой. Это не так сложно сделать, может быть, что-то вроде этого:

#!/usr/bin/env jruby

import java.sql.DriverManager

# TODO  some magic to load the driver
conn = DriverManager.getConnection(ARGV[0], ARGV[1], ARGV[2])
res = conn.executeQuery ARGV[3]

puts "<result>"
meta = res.meta_data
while res.next
  puts "<row>"

  for n in 1..meta.column_count
    column = meta.getColumnName n
    puts "<#{column}>#{res.getString(n)}</#{column}"
  end      

  puts "</row>"
end
puts "</result>"

Отказ от ответственности: Я только что все это придумал, я даже не удосужился притвориться, что это работает. : -)

1 голос
/ 21 сентября 2011

Другой вариант, в зависимости от того, сколько схем вам нужно вывести и / или насколько динамичным должно быть это решение, - это на самом деле писать XML непосредственно из оператора SQL, как в следующем простом примере ...

SELECT 
    '<Record>' ||
        '<name>' || name || '</name>' ||
        '<address>' || address || '</address>' ||
    '</Record>'
FROM
    contacts

Вы должны добавить и добавить элемент документа, но я думаю, что этот пример достаточно прост для понимания.

0 голосов
/ 21 сентября 2011

Я создал решение этой проблемы, используя эквивалент почтового слияния, используя набор результатов в качестве источника, и шаблон, с помощью которого он был объединен для создания желаемого XML.

Шаблон представлял собой стандартный XML с элементом Header, элементом Footer и элементом Body. Использование блока CDATA в элементе Body позволило мне включить полную структуру XML, которая служила шаблоном для каждой строки. Чтобы включить поля из набора результатов в шаблон, я использовал маркеры, которые выглядели так: <[FieldName]>. Затем шаблон был предварительно проанализирован, чтобы изолировать маркеры так, чтобы во время работы шаблон запрашивал каждое из полей из набора результатов при создании тела.

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

Все вышеперечисленное было инкапсулировано в класс Template, так что после загрузки шаблона я просто вызвал merge() в шаблоне, передавая набор результатов в качестве параметра.

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

В Java вы можете просто заполнить объект данными xml (например, объектным компонентом), а затем использовать XMLEncoder, чтобы получить его в xml. Оттуда вы можете использовать XSLT для дальнейшего преобразования или XMLDecoder, чтобы вернуть его к объекту.

Greetz, GHad

PS: См. http://ghads.wordpress.com/2008/09/16/java-to-xml-to-java/ для примера для части Объект в XML ... Из БД в Объект возможны еще несколько способов: JDBC, Groovy DataSets или GORM. Apache Common Beans может помочь заполнить JavaBeans с помощью методов, похожих на Reflection.

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

Технически преобразование результирующего набора в XML-файл является простым и не требует никаких инструментов, если только у вас нет требования преобразовать структуру данных в соответствии с конкретной схемой экспорта. Обычно набор результатов получает элемент верхнего уровня XML-файла, затем вы создаете несколько элементов записи, содержащих атрибуты, которые фактически являются полями записи.

Например, когда речь идет о Java, вам просто необходим соответствующий драйвер JDBC для взаимодействия с СУБД по вашему выбору, отвечающий требованиям независимости базы данных (обычно предоставляемых поставщиком СУБД), и несколько строк кода для чтения набора результатов. и распечатать строку XML для каждой записи, для каждого поля. На мой взгляд, не сложная задача для среднего разработчика Java.

В любом случае, чем более конкретную цель вы сформулируете, тем более конкретный ответ вы получите.

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

dbunit (www.dbunit.org) переходит с sql на xml и наоборот; Вы можете изменить его больше для своих нужд.

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