Skip to main content

pygixml — Python Giant XML

Python Versions PyPI version License: MIT Build Status Documentation Status GitHub Stars

pygixml — Python Giant XML — is a Cython framework built on two specialized C++ engines: pugixml for its in-memory DOM parser (XPath, objectify, dictify), and an inlined yxml push parser for true constant-memory streaming. Between the two, pygixml covers everything lxml and xmltodict do — dotted objectify navigation, XPath 1.0, and an xmltodict-compatible dictify — plus a streaming layer neither of them has, which is what makes pygixml the package of choice for big XML and big-data pipelines.

📚 View Full Documentation


Why pygixml?

Speed, memory, and size. pygixml brings pugixml's battle-tested C++ parser directly to Python — with numbers that speak for themselves.

Parsing Performance (5 000 elements, 50 iterations)

Library Avg Time Speedup vs ElementTree
pygixml 0.0009 s 9.2× faster
lxml 0.0041 s 2.0× faster
ElementTree 0.0083 s 1.0× (baseline)

Memory Usage (5 000 elements, peak)

Library Peak Memory vs ElementTree
pygixml 0.67 MB 7.2× less
lxml 0.67 MB 7.2× less
ElementTree 4.84 MB 1.0×

Package Size

Library Installed Size vs lxml
pygixml 0.43 MB 12.7× smaller
lxml 5.48 MB 1.0×

All numbers from benchmarks/full_benchmark.py. See the Performance page for the full comparison across 6 XML sizes.

Built for big XML

Those benchmark numbers are for documents that fit comfortably in memory. For the documents that don't — multi-gigabyte exports, logs, data dumps — pygixml's streaming layer is the part lxml and xmltodict simply don't have:

  • pygixml.iterfind / dictify.iterdict / jsonify.iterjsonl — yxml-based incremental parsing in constant memory: one element (or one dict, or one JSON line) in flight at a time, regardless of whether the source document is 10 KB or 10 GB.
  • jsonify.stream_dump(xml_path, json_path) — the headline feature: converts a giant XML file into a single, valid, giant JSON file, entirely in C++, in constant memory, with an xmltodict-compatible output shape (same @attr / #text / repeated-siblings-as-array conventions as dictify.parse). No DOM tree is ever built, no intermediate Python dict/list/str is ever allocated, and the file never has to fit in RAM — only an in-place seek-and-patch trick on the output file is used to close JSON arrays correctly as repeated siblings are discovered. As far as we know, this is the only Python package that can do this without buffering the document, the output, or both, and without crashing the process once the file gets genuinely large.
  • jsonify.stream_jsonl(xml_path, jsonl_path, tag) — the file-to-file counterpart of iterjsonl (filters by tag, unlike stream_dump which always converts the whole document): streams straight to a .jsonl file, one matched element per line, same constant-memory, all-C++ guarantee.
from pygixml import jsonify

# A multi-GB XML file in, a multi-GB JSON file out -- peak memory stays flat.
jsonify.stream_dump("huge_export.xml", "huge_export.json")

# Or, one record per line:
jsonify.stream_jsonl("huge_export.xml", "huge_export.jsonl", "record")

Features

  • Blazing-fast parsing — up to 14× faster than ElementTree
  • Low memory — 7× less than ElementTree, on par with lxml
  • Tiny footprint — 0.43 MB installed (12.7× smaller than lxml)
  • Full XPath 1.0 — complete query engine with all standard functions
  • Pythonic API — intuitive properties and methods, not a direct C++ mirror
  • objectify — lxml.objectify-style dotted navigation
  • dictify — xmltodict-compatible XML → dict conversion
  • jsonify — direct XML → JSON, in memory or streamed straight to disk in constant memory (stream_dump, stream_jsonl)
  • Streaming (iterfind, iterdict, iterjsonl) — constant-memory, yxml-based incremental parsing for documents too big to load whole
  • Cross-platform — Windows, Linux, macOS
  • Text extraction — recursive text gathering with configurable joins
  • XML serialization — output with custom indentation
  • Node iteration — depth-first traversal of the entire document

Installation

# From PyPI
pip install pygixml

# Or from GitHub
pip install git+https://github.com/MohammadRaziei/pygixml.git

Quick Start

import pygixml

# Parse XML from string
xml = """
<library>
    <book id="1" category="fiction">
        <title>The Great Gatsby</title>
        <author>F. Scott Fitzgerald</author>
        <year>1925</year>
    </book>
    <book id="2" category="fiction">
        <title>1984</title>
        <author>George Orwell</author>
        <year>1949</year>
    </book>
</library>
"""

doc = pygixml.parse_string(xml)
root = doc.root                           # <library>

# Access children and attributes
book = root.child("book")
print(book.name)                          # book
print(book.attribute("id").value)         # 1
print(book.child("title").text())         # The Great Gatsby

# XPath queries
fiction = root.select_nodes("book[@category='fiction']")
print(f"Found {len(fiction)} fiction books")

# Create & save
doc = pygixml.XMLDocument()
root = doc.append_child("catalog")
root.append_child("item").set_value("Hello")
doc.save_file("output.xml")

Properties vs Methods

A quick reference so you don't get tripped up:

Properties (no ()) Methods (need ())
node.name, node.value, node.type node.child(name)
node.parent, node.next_sibling node.first_child()
node.xml, node.xpath node.append_child(name)
attr.name, attr.value node.set_value(v)
doc.root node.select_nodes(query)
node.first_attribute()
node.text()

objectify — dotted navigation

pygixml.objectify provides an lxml.objectify-inspired interface for navigating XML with plain Python attribute access.

from pygixml import objectify

xml = """
<database name="users_db" version="1.2">
    <user-profile id="101" verified="true">
        <first_name>Mohammad</first_name>
        <balance>450.75</balance>
    </user-profile>
    <entry>Value A</entry>
    <entry>Value B</entry>
</database>
"""

root = objectify.from_string(xml)

# Dotted navigation — underscores map to hyphens automatically
print(root.user_profile.first_name)        # ObjectifiedElement(<first_name>)
print(str(root.user_profile.first_name))   # 'Mohammad'

# Automatic type inference for attributes
print(root.version)                        # 1.2   (float)
print(root.user_profile.id)               # 101   (int)
print(root.user_profile.verified)         # True  (bool)

# Text content
print(str(root.user_profile.first_name))  # 'Mohammad'   always str
print(root.user_profile.balance())        # 450.75        type-inferred

# Repeated siblings — indexing and iteration
print(root.entry[0])                      # ObjectifiedElement
print([str(e) for e in root.entry])       # ['Value A', 'Value B']

# Safe attribute access — never raises
print(root.get('version'))                # 1.2
print(root.get('missing', 'default'))     # 'default'

# Search descendants
print(root.find('balance'))               # ObjectifiedElement(<balance>)
print(root.find('balance', recursive=False))  # None  (not a direct child)
print(root.findall('entry'))              # [ObjectifiedElement, ...]

# Write support — modify in place
root.user_profile.first_name = "Ali"      # update child element text
root.version = 2.0                        # update attribute
root.timeout = 30                         # create new child element

# Delete
del root.timeout                          # remove child element
del root.version                          # remove attribute

objectify API

Feature Behaviour
root.child_tag First <child_tag> element; falls back to <child-tag>
root.attr_name Attribute value (type-inferred) when no child matches
root.tag[n] Index into repeated siblings
for e in root.tag Iterate repeated siblings
str(elem) Raw text content, always str
elem() Type-inferred text content
elem.get(name, default) Safe attribute read, never raises
elem.find(tag) First matching descendant, or None
elem.findall(tag) All matching descendants
elem.name = value Update child text or attribute; create child if absent
del elem.name Remove child element or attribute
elem.tag XML tag name string
elem.attrib {name: typed_value} dict of all attributes
elem.xml Serialised XML of the subtree
Child beats attribute When both share a name, child wins (read and write)

dictify — XML to dict

pygixml.dictify converts XML to a nested dict, compatible with the xmltodict library.

from pygixml import dictify

xml = """
<database name="users_db" version="1.2">
    <user-profile id="101" verified="true">
        <first_name>Mohammad</first_name>
        <balance>450.75</balance>
    </user-profile>
    <entry>Value A</entry>
    <entry>Value B</entry>
</database>
"""

# Parse XML → dict
d = dictify.parse(xml)
# {
#   'database': {
#     '@name': 'users_db',
#     '@version': '1.2',
#     'user-profile': {
#       '@id': '101', '@verified': 'true',
#       'first_name': 'Mohammad', 'balance': '450.75'
#     },
#     'entry': ['Value A', 'Value B']
#   }
# }

# Repeated siblings → list automatically
print(d['database']['entry'])             # ['Value A', 'Value B']

# Attributes prefixed with '@'
print(d['database']['@name'])             # 'users_db'

# Custom options
d = dictify.parse(xml,
    attr_prefix='',       # no prefix — attrs and children in same namespace
    cdata_key='text',     # key for text content (default '#text')
    force_list={'entry'}, # always a list, even with one element
)

# Parse from file
d = dictify.parse_file('data.xml')

# Convert back to XML
xml_out = dictify.unparse(d, pretty=True, indent='\t')
print(xml_out)

dictify API

Parameter Default Description
attr_prefix "@" Prefix added to attribute keys
cdata_key "#text" Key for text content in mixed nodes
force_list None Tag names always wrapped in a list; pass True for all
Function Description
dictify.parse(xml, **opts) Parse XML string → dict
dictify.parse_file(path, **opts) Parse XML file → dict
dictify.unparse(d, pretty, indent, ...) dict → XML string

Advanced Features

Text Content Extraction

import pygixml

xml = """
<root>
    <simple>Hello World</simple>
    <nested>
        <child>Child Text</child>
        More text
    </nested>
    <mixed>Text <b>with</b> mixed <i>content</i></mixed>
</root>
"""

doc = pygixml.parse_string(xml)
root = doc.root

print(root.child("simple").text())                # Hello World
print(root.child("nested").text(join=" | "))      # Child Text | More text
print(root.child("mixed").text(recursive=False))  # Text

XML Serialization

import pygixml

doc = pygixml.XMLDocument()
root = doc.append_child("root")
root.append_child("item").set_value("content")

print(root.xml)
# <root>
#   <item>content</item>
# </root>

print(root.to_string("    "))  # 4-space indent

Document Iteration

import pygixml

doc = pygixml.parse_string("<root><a/><b/></root>")

for node in doc:
    print(f"{node.type:12s} {node.name}")
# document
# element       root
# element       a
# element       b

Modifying XML

import pygixml

doc = pygixml.parse_string("<person><name>John</name></person>")
root = doc.root

root.child("name").set_value("Jane")
root.child("name").name = "full_name"
root.append_child("age").set_value("30")

print(root.xml)
# <person>
#   <full_name>Jane</full_name>
#   <age>30</age>
# </person>

XPath Support

Full XPath 1.0 via pugixml's engine:

import pygixml

xml = """
<library>
    <book id="1" category="fiction">
        <title>The Great Gatsby</title>
        <author>F. Scott Fitzgerald</author>
        <year>1925</year>
        <price>12.99</price>
    </book>
    <book id="2" category="fiction">
        <title>1984</title>
        <author>George Orwell</author>
        <year>1949</year>
        <price>10.99</price>
    </book>
</library>
"""

doc = pygixml.parse_string(xml)
root = doc.root

# Select nodes
books = root.select_nodes("book")
print(f"Found {len(books)} books")

# Predicates
fiction = root.select_nodes("book[@category='fiction']")
print(f"Found {len(fiction)} fiction books")

# Single node
book = root.select_node("book[@id='2']")
if book:
    print(book.node.child("title").text())    # 1984

# Pre-compiled query for repeated use
query = pygixml.XPathQuery("book[year > 1930]")
recent = query.evaluate_node_set(root)
print(f"Found {len(recent)} books published after 1930")

# Scalar evaluations
avg = pygixml.XPathQuery("sum(book/price) div count(book)").evaluate_number(root)
print(f"Average price: ${avg:.2f}")           # Average price: $11.99

has_orwell = pygixml.XPathQuery("book[author='George Orwell']").evaluate_boolean(root)
print(f"Has Orwell books: {has_orwell}")       # Has Orwell books: True

Supported XPath

Category Examples
Node selection //book, /library/book, book[1]
Attributes book[@id], book[@category='fiction']
Boolean ops and, or, not()
Comparisons =, !=, <, >, <=, >=
Math +, -, *, div, mod
Functions position(), last(), count(), sum(), string(), number()
Axes child::, attribute::, descendant::, ancestor::
Wildcards *, @*, node()

Core API

Class / Module Purpose
XMLDocument Document-level operations: load, save, append-child
XMLNode Navigate, read, and modify individual nodes
XMLAttribute Attribute name and value access
XPathQuery Pre-compiled XPath queries for repeated evaluation
XPathNode Single XPath result (wraps a node or attribute)
XPathNodeSet Collection of XPath results
objectify lxml.objectify-style dotted navigation
dictify xmltodict-compatible XML → dict conversion
jsonify Direct XML → JSON: in-memory dumps*, or constant-memory stream_dump/stream_jsonl
iterfind / iterparse yxml-based constant-memory streaming parser, ElementTree-style

Module-level functions: parse_string(xml), parse_file(path).


Benchmarks

python benchmarks/full_benchmark.py
python benchmarks/benchmark_parsing.py

Compares pygixml against lxml and xml.etree.ElementTree. Results are printed as tables and saved to benchmarks/results/benchmark_full.json.


Documentation

📖 Full docs: https://mohammadraziei.github.io/pygixml/


Security

pygixml is not affected by the common XML attacks (XXE, Billion Laughs, external DTD retrieval) that lxml/defusedxml guard against, because its two embedded parsers — pugixml (DOM API) and yxml (streaming API) — never implement custom entity resolution or external DTD fetching in the first place, so there's no "safe mode" to configure. See #8 for the full technical breakdown.


License

MIT License — see LICENSE.

Enjoy pygixml? Star the repository ⭐ 👉 Star pygixml on GitHub


Acknowledgments

  • pugixml — Fast and lightweight C++ XML library
  • yxml — Tiny, dependency-free streaming XML parser, powering pygixml's constant-memory streaming layer
  • Cython — C extensions for Python
  • scikit-build — Modern Python build system

Metadata

Release files for pygixml 0.12.2

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

Source distribution (sdist)

Source distribution for pygixml 0.12.2
File Size Uploaded
pygixml-0.12.2.tar.gz 767.4 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for pygixml 0.12.2
File
pygixml-0.12.2-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
pygixml-0.12.2-cp310-abi3-win32.whl CPython 3.10 abi3 Windows x86-32 Details
pygixml-0.12.2-cp310-abi3-musllinux_1_2_x86_64.whl CPython 3.10 abi3 Linux musl 1.2+ x86-64 Details
pygixml-0.12.2-cp310-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 abi3 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details
pygixml-0.12.2-cp310-abi3-macosx_10_9_universal2.whl CPython 3.10 abi3 macOS 10.9+ universal2 (ARM64, x86-64) Details
pygixml-0.12.2-cp39-cp39-win_amd64.whl CPython 3.9 CPython 3.9 Windows x86-64 Details
pygixml-0.12.2-cp39-cp39-win32.whl CPython 3.9 CPython 3.9 Windows x86-32 Details
pygixml-0.12.2-cp39-cp39-musllinux_1_2_x86_64.whl CPython 3.9 CPython 3.9 Linux musl 1.2+ x86-64 Details
pygixml-0.12.2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.24+ x86-64, Linux glibc 2.28+ x86-64 Details
pygixml-0.12.2-cp39-cp39-macosx_10_9_universal2.whl CPython 3.9 CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64) Details
pygixml-0.12.2-cp38-cp38-win_amd64.whl CPython 3.8 CPython 3.8 Windows x86-64 Details
pygixml-0.12.2-cp38-cp38-win32.whl CPython 3.8 CPython 3.8 Windows x86-32 Details
pygixml-0.12.2-cp38-cp38-musllinux_1_2_x86_64.whl CPython 3.8 CPython 3.8 Linux musl 1.2+ x86-64 Details
pygixml-0.12.2-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.8 CPython 3.8 Linux glibc 2.24+ x86-64, Linux glibc 2.28+ x86-64 Details
pygixml-0.12.2-cp38-cp38-macosx_10_9_universal2.whl CPython 3.8 CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64) Details

Total release size: 10.0 MB

Release files / pygixml-0.12.2.tar.gz

Download URL pygixml-0.12.2.tar.gz
Size 767.4 kB
Tags Source
SHA-256 checksum
How to use checksums
38b9ea48871bed58845d74f84a2dce9d8392a65f1c31346d1fb55f77755d0b8a
BLAKE2b-256 checksum
How to use checksums
ed5a18a0a832fd843057875e5bbf41a6aafeddf78929815a4165eebcb83315d6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp310-abi3-win_amd64.whl

Download URL pygixml-0.12.2-cp310-abi3-win_amd64.whl
Size 324.1 kB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
4750331eef915ff03485c0a00dbc929bc804c867f2970dd620e8f0c6032e637e
BLAKE2b-256 checksum
How to use checksums
d3b011aa6af94904711803169d70f7e240ae04b6b2cb6533c07275075f73ddea
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp310-abi3-win32.whl

Download URL pygixml-0.12.2-cp310-abi3-win32.whl
Size 272.3 kB
Tags CPython 3.10 Windows x86-32 abi3
SHA-256 checksum
How to use checksums
e67020a4c3f27984b455cb27b5b892e59705c557d1b24c668f0ac20b18badf11
BLAKE2b-256 checksum
How to use checksums
28d2c2c78084aa511a31ba29dde2e5983f6aed6cced22160ebb6ba7d0a281e3c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp310-abi3-musllinux_1_2_x86_64.whl

Download URL pygixml-0.12.2-cp310-abi3-musllinux_1_2_x86_64.whl
Size 1.4 MB
Tags CPython 3.10 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
758cdba6bbe3de3f65e2160a94b75c49451e324ecf4a8671ae531c33ca95616f
BLAKE2b-256 checksum
How to use checksums
5af209305a368cea24ca908fa8f8d563f469cc0849cd00e4d7a420c280b66d07
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp310-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL pygixml-0.12.2-cp310-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 412.1 kB
Tags CPython 3.10 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
e19d47f74e6bfbc8d36c449c8dd4e941ed9e091e4f48f4c8e38d98a7545d5804
BLAKE2b-256 checksum
How to use checksums
6a703fe149d5dc1fb1b365f7e2993105f09f44be6f8cb98b698c1a2db9a29dc3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp310-abi3-macosx_10_9_universal2.whl

Download URL pygixml-0.12.2-cp310-abi3-macosx_10_9_universal2.whl
Size 609.2 kB
Tags CPython 3.10 abi3 macOS 10.9+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
357cb6cb86473e6e026f0536f6dea58edcdc33f730596a5db2100bca1707052c
BLAKE2b-256 checksum
How to use checksums
b06d0ade669723b2821db87e3821a4fbe6799818e174816deec3952cdf9aa920
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp39-cp39-win_amd64.whl

Download URL pygixml-0.12.2-cp39-cp39-win_amd64.whl
Size 327.6 kB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
7d3afbd1ee04a5db77a74a22014b6186312eebd8e12ebf998a6847b5e7fdbc0e
BLAKE2b-256 checksum
How to use checksums
3fc50bbc3d7d5fc12158b892c39fab0a35cbd266922a2d0be35be46f5389237e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp39-cp39-win32.whl

Download URL pygixml-0.12.2-cp39-cp39-win32.whl
Size 282.2 kB
Tags CPython 3.9 Windows x86-32
SHA-256 checksum
How to use checksums
75ed72e35dcf752e5b31f5da1c5e60e94a8fe882853113bfd61e8b4fb93f0e41
BLAKE2b-256 checksum
How to use checksums
ca169d1d3a1fc1e655b718f7eacc3d1c74499c14f4158eebc9c4c767094265b0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp39-cp39-musllinux_1_2_x86_64.whl

Download URL pygixml-0.12.2-cp39-cp39-musllinux_1_2_x86_64.whl
Size 1.4 MB
Tags CPython 3.9 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
ffe7e02957e91a02c65d5ce992cd7a0dd9e99871672386fbbfdb8e780c58979d
BLAKE2b-256 checksum
How to use checksums
2dfbd7562bc346dea704fd15a4020eea117e86db83aa765d749ebd5cb1ca7a45
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL pygixml-0.12.2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 417.4 kB
Tags CPython 3.9 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
2488546820aef93e26ba399cddb5305f4ad213438cd841f871561c83e443f3e5
BLAKE2b-256 checksum
How to use checksums
b6695cbd30026d1890e4ad560b11e6a69a9d00614a29002c87f1cf0f3be498e5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp39-cp39-macosx_10_9_universal2.whl

Download URL pygixml-0.12.2-cp39-cp39-macosx_10_9_universal2.whl
Size 635.5 kB
Tags CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
69afd289b15abb86c13646293ee8a6d56786b25b2528e15156e5ef3d1bae944f
BLAKE2b-256 checksum
How to use checksums
75d071492572ce9c1b1443c0f0893d5f551122662ed699e736322df0c2ae3adb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp38-cp38-win_amd64.whl

Download URL pygixml-0.12.2-cp38-cp38-win_amd64.whl
Size 311.6 kB
Tags CPython 3.8 Windows x86-64
SHA-256 checksum
How to use checksums
44e3cf3d1d885c37b22bdf841101412256f3839fcb3ce4c6ae405fceb6de6d6c
BLAKE2b-256 checksum
How to use checksums
760a2c5f13c75c5d122b880e1db8b97a76c73b132830658af5781dfcaed97cff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp38-cp38-win32.whl

Download URL pygixml-0.12.2-cp38-cp38-win32.whl
Size 266.2 kB
Tags CPython 3.8 Windows x86-32
SHA-256 checksum
How to use checksums
40d7cee1d26d3cbb5c2a271f5423baccbd603d13d1ce067a9ad081cf9f708218
BLAKE2b-256 checksum
How to use checksums
f4901fbd6125e0349fa21dc61c7082ebb67a2ad20842b6b87172adbe1a553813
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp38-cp38-musllinux_1_2_x86_64.whl

Download URL pygixml-0.12.2-cp38-cp38-musllinux_1_2_x86_64.whl
Size 1.4 MB
Tags CPython 3.8 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
8581e0f068b767a435523335e5168d778448236a10a220d492d238bb7d879d73
BLAKE2b-256 checksum
How to use checksums
bd9492261ac4123e9e855c275cebbc002594cd1ab5583211ccabef387e2917aa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL pygixml-0.12.2-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 400.0 kB
Tags CPython 3.8 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
c0ca4adcf5d66e07ec3614c198a165f90b710e8380a9538904c43d06b44ac620
BLAKE2b-256 checksum
How to use checksums
9ce395247f9dc5b7a8f24f64bbb311844955db58702eb1b049544efd7f6eac66
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pygixml-0.12.2-cp38-cp38-macosx_10_9_universal2.whl

Download URL pygixml-0.12.2-cp38-cp38-macosx_10_9_universal2.whl
Size 629.9 kB
Tags CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
e70df548ca4d82c9714d77cfe4803eb57bc0f32406e91f869479afc35635370f
BLAKE2b-256 checksum
How to use checksums
e83cdd8bf53c4dbde752308b25aeb8649e764e805d9229b7b703865e7a334c45
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

0.12.2 This release

16 release files

0.9.2

36 release files

0.9.1

35 release files

0.5.1

48 release files

0.4.0

48 release files

0.3.0

48 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