Skip to main content

xml_stream

A simple XML file and string reader that is able to read big XML files and strings by using streams (iterators), with an option to convert to dictionaries

Description

xml_stream comprises two helper functions:

read_xml_file

When given a path to a file and the name of the tag that holds the relevant data, it returns an iterator of the data as xml.etree.ElementTree.Element object by default, or as dicts when to_dict argument is True

read_xml_string

When given an XML string and the name of the tag that holds the relevant data, it returns an iterator of the data as xml.etree.ElementTree.Element object by default, or as dicts when to_dict argument is True

Main Dependencies

Getting Started

  • Install the package

    pip install xml_stream
    
  • Import the read_xml_file and the read_xml_string classes and use accordingly

    from xml_stream import read_xml_file, read_xml_string
    
    xml_string = """
    <company>
          <staff>
              <operations_department>
                  <employees>
                      <team>Marketing</team>
                      <location name="head office" address="Kampala, Uganda" />
                      <bio first_name="John" last_name="Doe">John Doe</bio>
                      <bio first_name="Jane" last_name="Doe">Jane Doe</bio>
                      <bio first_name="Peter" last_name="Doe">Peter Doe</bio>
                  </employees>
                  <employees>
                      <team>Customer Service</team>
                      <location name="Kampala branch" address="Kampala, Uganda" />
                      <bio first_name="Mary" last_name="Doe">Mary Doe</bio>
                      <bio first_name="Harry" last_name="Doe">Harry Doe</bio>
                      <bio first_name="Paul" last_name="Doe">Paul Doe</bio>
                  </employees>
              </operations_department>
          </staff>
    </company>
    """
    
    file_path = '...' # path to your XML file
    
    # For XML strings, use read_xml_string which returns an iterator  
    for element in read_xml_string(xml_string, records_tag='staff'):
        # returns the element as xml.etree.ElementTree.Element by default
        # ...do something with the element
        print(element)
    
    # Note that if a tag is namespaced with say _prefix:tag_ and domain is _xmlns:prefix="https://example",
    # the records_tag from that tag will be '{https://example}tag'
    for element_as_dict in read_xml_string(xml_string, records_tag='staff', to_dict=True):
        # returns the element as dictionary
        # ...do something with the element dictionary
        print(element_as_dict)
        # will print
        """
        {
              'operations_department': {
                  'employees': [
                      [
                          {
                              'team': 'Marketing',
                              'location': {
                                  'name': 'head office',
                                  'address': 'Kampala, Uganda'
                              },
                              'first_name': 'John',
                              'last_name': 'Doe',
                              '_value': 'John Doe'
    
                          },
                          {
                              'team': 'Marketing',
                              'location': {
                                  'name': 'head office',
                                  'address': 'Kampala, Uganda'
                              },
                              'first_name': 'Jane',
                              'last_name': 'Doe',
                              '_value': 'Jane Doe'
    
                          },
                          {
                              'team': 'Marketing',
                              'location': {
                                  'name': 'head office',
                                  'address': 'Kampala, Uganda'
                              },
                              'first_name': 'Peter',
                              'last_name': 'Doe',
                              '_value': 'Peter Doe'
    
                          }, ],
                      [
                          {
                              'team': 'Customer Service',
                              'location': {
                                  'name': 'Kampala branch',
                                  'address': 'Kampala, Uganda'
                              },
                              'first_name': 'Mary',
                              'last_name': 'Doe',
                              '_value': 'Mary Doe'
    
                          },
                          {
                              'team': 'Customer Service',
                              'location': {
                                  'name': 'Kampala branch',
                                  'address': 'Kampala, Uganda'
                              },
                              'first_name': 'Harry',
                              'last_name': 'Doe',
                              '_value': 'Harry Doe'
    
                          },
                          {
                              'team': 'Customer Service',
                              'location': {
                                  'name': 'Kampala branch',
                                  'address': 'Kampala, Uganda'
                              },
                              'first_name': 'Paul',
                              'last_name': 'Doe',
                              '_value': 'Paul Doe'
    
                          }
                      ],
                  ]
              }
        }
        """
    
    # For XML files (even really large ones), use read_xml_file which also returns an iterator  
    for element in read_xml_file(file_path, records_tag='staff'):
        # returns the element as xml.etree.ElementTree.Element by default
        # ...do something with the element
        print(element)
    
    for element_as_dict in read_xml_file(file_path, records_tag='staff', to_dict=True):
        # returns the element as dictionary
        # ...do something with the element dictionary
        print(element_as_dict)
        # see the print output for read_xml_string
    

How to test

  • Clone the repo and enter its root folder

    git clone https://github.com/sopherapps/xml_stream.git && cd xml_stream
    
  • Create a virtual environment and activate it

    virtualenv -p /usr/bin/python3.6 env && source env/bin/activate
    
  • Install the dependencies

    pip install -r requirements.txt
    
  • Download a huge xml file for test purposes and save it in the /test folder as huge_mock.xml

    wget http://aiweb.cs.washington.edu/research/projects/xmltk/xmldata/data/SwissProt/SwissProt.xml && mv SwissProt.xml test/huge_mock.xml
    
  • Run the test command

    python -m unittest
    

Acknowledgements

License

Copyright (c) 2020 Martin Ahindura Licensed under the MIT License

Metadata

Release files for xml-stream 0.0.8

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

Source distribution (sdist)

Source distribution for xml-stream 0.0.8
File Size Uploaded Provenance
xml_stream-0.0.8.tar.gz 6.4 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for xml-stream 0.0.8
File Interpreter ABI Platform
xml_stream-0.0.8-py3-none-any.whl Python 3 none any Details

Total release size: 12.8 kB

Release files / xml_stream-0.0.8.tar.gz

Download URL xml_stream-0.0.8.tar.gz
Size 6.4 kB
Tags Source
SHA-256 checksum
How to use checksums
4638f2d11d4aad4ab4dc885243b0bb416faccd49dec7cb23f160152bf68a9a92
BLAKE2b-256 checksum
How to use checksums
6d1963dc6dcbb69a188c54bce8a6bf9bdd41318ecf72d2ee22846c76be2be256
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.49.0 CPython/3.6.14

Release files / xml_stream-0.0.8-py3-none-any.whl

Download URL xml_stream-0.0.8-py3-none-any.whl
Size 6.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8bdb763431eb19bca6f97e70bb5c2bd62807fad65ae20fdb8c64c1f05f5e870d
BLAKE2b-256 checksum
How to use checksums
9633c4b9d009e2bf69f182f4ead8b3af22ad19714aa78d841dde32299e3b01a6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.49.0 CPython/3.6.14

Security for xml-stream 0.0.8

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

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