Skip to main content

AskXML

Run SQL statements on XML documents

<xml>
    <fruit color='green'>tasty kiwi</fruit>
    <fruit color='dark green'>old kiwi</fruit>
    <fruit color='green'>apple</fruit>
</xml>
>>> from askxml import AskXML

>>> conn = AskXML('file.xml')
# get an SQL cursor object
>>> c = conn.cursor()
>>> results = c.execute("SELECT color FROM fruit WHERE _text LIKE '% kiwi'")
>>> for row in results.fetchall():
>>>    print(row)
[('green'), ('dark green')]

# cleanup
>>> c.close()
>>> conn.close()

BUT WHY?

There are data dumps like stack exchange's, stored in XML. They're big, so fitting them whole into memory is not desired. With AskXML you can query things fast, and rather comfortably (provided you know SQL).

Before you go any further though, it's very possible your task can be achieved with XPATH and ElementTree XML API, so give that a look if you haven't heard of it.

Installation

A pip package is on it's way.

Usage

Adding indexes and defining columns

If you want to add indexes, columns or set attribute types, you can pass a list of table definitions:

from askxml import *
tables = [
    Table('fruit',
        Column('age', Integer()),
        Index('age'))
]
with AskXML('file.xml', table_definitions=tables) as conn:
    c = conn.cursor()
    c.execute("UPDATE fruit SET age = 5 WHERE _text = 'tasty kiwi'")
    c.close()

You don't need to define all existing columns or tables. If a definition was not found, it's created with all column types being Text by default.

Node hierarchy

If you want to find nodes that are children of another node by attribute:

<xml>
    <someParent name='Jerry'>
        <someChild name='Morty' />
        <someChild name='Summer' />
    </someParent>
</xml>
from askxml import *
with AskXML('file.xml') as conn:
    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'
    """)
    for row in results.fetchall():
        print(row)
    c.close()

This will print [('Morty'), ('Summer')].

Inserting new data

If you want to add a new tag:

cursor.execute("INSERT INTO fruit (color, _text) VALUES ('red', 'strawberry')")

Or if your nodes have a hierarchy:

cursor.execute("INSERT INTO someParent_someChild (name, _parentId) VALUES ('a baby', 1)")

License

AskXML is licensed under MIT license

Metadata

Release files for askxml 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for askxml 1.0.0
File Size Uploaded
askxml-1.0.0.tar.gz 8.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for askxml 1.0.0
File Interpreter ABI Platform
askxml-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 18.8 kB

Release files / askxml-1.0.0.tar.gz

Download URL askxml-1.0.0.tar.gz
Size 8.3 kB
Tags Source
SHA-256 checksum
How to use checksums
5ab887bffaaa6af45fd35d459093a8cb492db256f82b290a855d3a7aec1f7856
BLAKE2b-256 checksum
How to use checksums
0476ce523e19e4b11a364c5dcc6f7e3da5cdc42b27485be7482bb3dfd6d4708d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / askxml-1.0.0-py3-none-any.whl

Download URL askxml-1.0.0-py3-none-any.whl
Size 10.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9908b6b35baba2c9a1ae028091c94bc109587b7e84b448e86047bc5e2ddd2f93
BLAKE2b-256 checksum
How to use checksums
5c7e3abbd91cf720ec33cefce91a57064b7044fec50218ffcec3f5de0f115697
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page