使用python从SQL表生成XML

2024-05-29 08:28:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些XML,如下所示:

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

我将它解析为两个SQL表,一个用于标记,一个用于pcdata。“开始”和“停止”列表示标记出现的位置和结束位置。在

^{pr2}$

现在我想将这个数据库解析回原始格式的XML。我想写一个函数,它接受两个表并将XML写在一个文件中。我使用python和psycopg2来实现这一点。在


Tags: 函数frankname标记数据库sqlsam格式
3条回答

简单的答案是不要,如果您使用的是postgres8.3或更高版本,那么就使用SQL来构建XML。会容易得多。在

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

嗯,解码了你的“专栏”:

<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表”只是您存放数据的特殊表示的地方。在

下面是一些伪代码来执行您想执行的操作:

^{pr2}$

对于上面提到的是否会将“positions”放在输出流中的问题:不,它不会;下面的代码片段显示它是有效的。这些位置仅用于将汤按正确的顺序分类。在“join”中,piece[0]表示位置,但它没有使用,只有piece[1]这是必需的文本。在

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

关于SQL评论问题:

虽然用SQLite显示,但这是bog标准SQL。如果您的数据库没有使用||作为连接运算符,请尝试+。在

你忘了问一个问题:“我怎么才能把一个<?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>

首先,如果Postgres包含为您创建XML的机制,请使用它们。在

其次,除非你真的知道自己在做什么,否则不要使用字符串操作来创建XML。即使这样,也不要这样做。例如,如果任何列包含与号,那么仅仅从数据库中连接字符串值将生成格式不好的XML。在

除非处理的数据太多而无法放入内存,否则请使用johnmachin的方法将数据解析为元素,并使用lxml.etree来创建实际的XML元素。在

相关问题 更多 >

    热门问题