Использование python для генерации XML из таблиц SQL

1

У меня есть XML следующим образом:

<dd>
    <persson>
        <name>sam</name>
        <tel>9748</tel>
    </persson>
    <cat>
        <name>frank</name>
    </cat>
</dd>

Я проанализировал его на две таблицы SQL: один для тегов и один для pcdata. Столбцы начала и остановки представляют позицию, в которой тег появляется и заканчивается.

Tags:
 start | stop |  tag   
-------+------+--------
     3 |    5 | name
     6 |    8 | tel
     2 |    9 | persson
    11 |   13 | name
    10 |   14 | cat
     1 |   15 | dd
(6 rows)

Pcdata:
 pos | pcdata 
-----+--------
   4 | sam
   7 | 9748
  12 | frank
(3 rows)

Теперь я хотел бы проанализировать эту базу данных в XML в исходной форме. Я хочу написать функцию, которая берет обе таблицы и записывает XML в файл. Я использую python и psycopg2 для этого.

  • 0
    Что случилось с ОП?
  • 0
    @Danosure: похоже, он редактировал свой вопрос, набил его и не знал, как это исправить. Я сделал откат.
Теги:

3 ответа

3

H'mmm, расшифровав ваши "столбцы":

<dd><persson><name>sam</name><tel>9748</tel></persson>
1   2        3     4  5      6    7   8     9                    
<cat><name>frank</name></cat></dd>
10   11    12   13     14    15

У меня есть несколько вопросов для вас: как вы это сделали? Почему ты это сделал? Что именно вы хотите достичь? Обратите внимание, что заголовок вопроса довольно вводит в заблуждение. "Таблицы SQL" - это всего лишь место, где вы разместили свое специфическое представление данных.

Здесь некоторый псевдокод делать то, что вы хотите сделать:

pieces = []
result = cursor.execute("select * from tags;")
for start, step, tag in result:
    pieces.append((start, "<" + tag + ">"))
    pieces.append((stop, "</" + tag + ">"))
result = cursor.execute("select * from pcdata;")
for pos, pcdata in result:
    pieces.append((pos, pcdata))
pieces.sort()
xml_stream = "".join(piece[1] for piece in pieces)
your_file_object.write(xml_stream)

В ответ на вопрос о том, поставит ли вышеупомянутое "позиции" в выходном потоке: "Нет"; следующий фрагмент показывает, что он работает. Позиции используются только для того, чтобы суп отсортирован в правильном порядке. В "join" piece[0] ссылается на позицию, но она не используется, только piece[1], которая является обязательным текстом.

>>> pieces
[(3, '<name>'), (4, 'sam'), (5, '</name>')]
>>> ''.join(piece[1] for piece in pieces)
'<name>sam</name>'

Рассматривается вопрос SQL-запроса:

Показывается с SQLite, это стандартный SQL-код. Если ваша база данных не grok || в качестве оператора конкатенации, попробуйте +.

Вопрос о том, что вы забыли спросить: "Как я могу получить <?xml blah-blah ?> вещь впереди?". Ответ: См. Ниже.

console-prompt>sqlite3
SQLite version 3.6.14
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table tags (start int, stop int, tag text);
sqlite> insert into tags values(3,5,'name');
sqlite> insert into tags values(6,8,'tel');
sqlite> insert into tags values(2,9,'persson');
sqlite> insert into tags values(11,13,'name');
sqlite> insert into tags values(10,14,'cat');
sqlite> insert into tags values(1,15,'dd');
sqlite> create table pcdata (pos int, pcdata text);
sqlite> insert into pcdata values(4,'sam');
sqlite> insert into pcdata values(7,'9748');
sqlite> insert into pcdata values(12,'frank');
sqlite> select datum from (
   ...>     select 0 as posn, '<?xml version="1.0" encoding="UTF-8"?>' as datum
   ...>     union
   ...>     select start as posn, '<' || tag || '>' as datum from tags
   ...>     union
   ...>     select stop as posn, '</' || tag || '>' as datum from tags
   ...>     union
   ...>     select pos as posn, pcdata as datum from pcdata
   ...>     )
   ...> order by posn;
<?xml version="1.0" encoding="UTF-8"?>
<dd>
<persson>
<name>
sam
</name>
<tel>
9748
</tel>
</persson>
<cat>
<name>
frank
</name>
</cat>
</dd>
sqlite>
  • 0
    Да, я пронумеровал позиции каждого тега и сохранил его в таблицах. Это способ, которым меня попросили представить данные.
  • 0
    Как я могу теперь восстановить XML из таблиц базы данных, которые я сделал?
Показать ещё 7 комментариев
1

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

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

Если вы не будете обрабатывать слишком много данных для размещения в памяти, используйте подход Джона Мачина для анализа данных в элементах и ​​ lxml.etree для создания реальных элементов XML.

1

Простой ответ - нет. Если вы используете Postgres 8.3 или выше, создайте XML с помощью SQL. Это будет намного проще.

http://www.postgresql.org/docs/current/static/functions-xml.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню