对XML文档运行SQL语句
askxml的Python项目详细描述
askxml
对XML文档运行SQL语句
<xml><fruitcolor='green'>tasty kiwi</fruit><fruitcolor='dark green'>old kiwi</fruit><fruitcolor='green'>apple</fruit></xml>
>>>fromaskxmlimportAskXML>>>conn=AskXML('file.xml')# get an SQL cursor object>>>c=conn.cursor()>>>results=c.execute("SELECT color FROM fruit WHERE _text LIKE '% kiwi'")>>>forrowinresults.fetchall():>>>print(row)[('green'),('dark green')]# cleanup>>>c.close()>>>conn.close()
但为什么呢?
有类似堆栈交换的数据转储,存储在XML中。它们很大,所以不需要把它们全部放进记忆中。使用askxml,您可以快速而舒适地查询事物(前提是您知道sql)。
在进一步讨论之前,很有可能使用xpath和elementtree xml api来完成您的任务,因此如果您还没有听说过,请查看一下。
安装
一个PIP包在路上。
用法
添加索引和定义列
如果要添加索引、列或设置属性类型,可以传递表定义列表:
fromaskxmlimport*tables=[Table('fruit',Column('age',Integer()),Index('age'))]withAskXML('file.xml',table_definitions=tables)asconn:c=conn.cursor()c.execute("UPDATE fruit SET age = 5 WHERE _text = 'tasty kiwi'")c.close()
不需要定义所有现有的列或表。如果找不到定义,则默认情况下创建该定义时所有列类型都是文本。
节点层次结构
如果要按属性查找另一个节点的子节点:
<xml><someParentname='Jerry'><someChildname='Morty'/><someChildname='Summer'/></someParent></xml>
fromaskxmlimport*withAskXML('file.xml')asconn:c=conn.cursor()results=c.execute(""" SELECT name FROM someParent_someChild as child INNER JOIN someParent as parent ON parent._id = child._parentId WHERE parent.name = 'Jerry' """)forrowinresults.fetchall():print(row)c.close()
这将打印[('Morty'), ('Summer')]
。
插入新数据
如果要添加新标记:
cursor.execute("INSERT INTO fruit (color, _text) VALUES ('red', 'strawberry')")
或者如果节点具有层次结构:
cursor.execute("INSERT INTO someParent_someChild (name, _parentId) VALUES ('a baby', 1)")
许可证
askxml是根据MIT license