• v1.16 c8033ce9d0

    v1.16 Stable

    archiver-bot released this 2026-06-15 15:38:00 -05:00 | 2 commits to master since this release

    pugixml-1.16 is out. This is an anniversary release: pugixml turns 20 this year!

    In early 2006, I was evaluating existing XML parsers to parse large COLLADA files quickly and nothing fit the bill; existing DOM parsers were very slow and often cumbersome to use, existing SAX parsers required a tricky parsing flow for documents with many internal references with unspecified order. The most promising existing parser was pugxml (no i), which had a nice API and an interesting parsing approach - but still left a lot of performance on the table so I thought I could quickly patch it up and call it a day. The project was named pugixml (where i stands for improved) in late May 2006.

    The first version was assigned a number 0.1 in July, and was used in a few internal projects. It was tiny: 1800 lines of code (plus 700 line header), no tree modification, no Unicode support, no XPath, no compact mode, slower parser. But it was quite useful and so the first version 0.2 was released to the public in November. Originally pugixml was developed in Subversion, until eventually migrating to Git on github.com. Over the following years it quickly gained important features that were missing in the original release; code got faster through continuous tuning; some APIs were adjusted or removed. The library started gaining wider adoption.

    In 2010, v1.0 came out. This represented a major stability point: it was the last release to remove or break any APIs, and since then pugixml has remained API-stable and also maintained binary compatibility. Since then, other important improvements have been introduced; for example, in 2015 a major new compilation mode, PUGIXML_COMPACT, allowed to significantly reduce the DOM memory consumption at a small performance cost with no change in API/ABI.

    Development continues to this day, 20 years later; in some sense, pugixml is “complete” - the library has worked great for the last decade and all critical functionality is there. But it still requires continued maintenance, as new compilers and language features introduce new problems, some latent bugs are occasionally found, and occasional new minor features are being added. What started as a quick excursion turned into a life-long project - here’s to the next decade!


    Behavior changes:

    • Elements that have a single empty PCDATA child are now printed as empty element tags (unless format_no_empty_element_tags is used)

    Improvements:

    • PUGIXML_CHARCONV_FLOAT option can be enabled to switch floating point conversions to <charconv>; this requires C++17, makes the conversions locale-independent and can improve performance
    • Add xml_node::ensure_child and xml_node::ensure_attribute that return the child/attribute with the specified name, adding one if it does not exist
    • Improve performance of searching for nodes and attributes by name
    • Loading a document from an empty buffer no longer performs memory allocations

    XPath improvements:

    • Improve performance of queries that evaluate or compare attribute values, like @attr > 5
    • Improve performance of queries that select nodes and attributes by name

    Bug fixes:

    • Fix stack overflow when removing subtrees with extremely deep nesting
    • Fix integer overflows that could lead to crashes when loading very large (1+ GB) documents on 32-bit platforms in PUGIXML_WCHAR_MODE
    • Fix null pointer dereference when copying xpath_variable_set objects that contain string variables with unassigned values

    CMake improvements:

    • Apple frameworks built with PUGIXML_BUILD_APPLE_FRAMEWORK now include framework headers
    • PUGIXML_INSTALL_SOURCE option can be used to install pugixml.cpp (useful for header-only mode)

    Compatibility improvements:

    • Add project files and NuGet packages for Visual Studio 2026
    • Fix compatibility with C++20 modules when including pugixml.hpp in the global module fragment
    • Fix clang/gcc warnings -Wextra-semi-stmt, -Wsign-conversion, -Wuninitialized (GCC16)
    • Fix compilation for Embarcadero C++ XE5
    • Work around several static analysis false positives

    Thanks to @e-kwsm, @luzpaz, @bilbothebaggins, @mosfet80, @Treata11, @sankhesh, @jgressma, @ravstrix, @seanm and @nolange for contributions!

    Downloads
  • v1.15 ee86beb30e

    v1.15 Stable

    archiver-bot released this 2025-01-10 12:15:31 -06:00 | 78 commits to master since this release

    Improvements:

    • Many xml_attribute:: and xml_node:: functions now transparently support std::string_view and std::string when C++17 support is detected.

    CMake improvements:

    • Improve pkg-config file generation for NixOS
    • PUGIXML_BUILD_APPLE_FRAMEWORK CMake option can be used to build pugixml as .xcframework
    • PUGIXML_INSTALL CMake option can be used to disable installation targets

    Compatibility improvements:

    • Fix clang/gcc warnings -Wzero-as-null-pointer-constant, -Wuseless-cast, -Wshorten-64-to-32
    • Fix unreferenced function warnings in PUGIXML_NO_STL configuration
    • Fix CMake 3.31 deprecation warnings
    • Stop using deprecated throw() when noexcept is available

    Note: due to a packaging issue, release archives below contain quickstart guide with version "1.14"; this is a minor error that does not affect the contents of the package or guide otherwise. An updated version is live on pugixml.org.

    Thanks to @richardapeters, @ilya-lavrenov, @PhilipBotha, @nathaniel-brough, @SoapGentoo, @kmilos, @aral-matrix, @dantargz, @r-barnes, @hughsie and @Treata11 for contributions!

    Downloads
  • v1.14 db78afc2b7

    v1.14 Stable

    archiver-bot released this 2023-09-07 13:55:13 -05:00 | 146 commits to master since this release

    Improvements:

    • xml_attribute::set_name and xml_node::set_name now have overloads that accept pointer to non-null-terminated string and size
    • Implement parse_merge_pcdata parsing mode in which PCDATA contents is merged into a single node when original document had comments that were skipped during parsing
    • xml_document::load_file now returns a more consistent error status when given a path to a folder

    Bug fixes:

    • Fix assertion in XPath number→string conversion when using non-English locales
    • Fix PUGIXML_STATIC_CRT CMake option to correctly select static CRT when using MSVC and recent CMake

    Compatibility improvements:

    • Fix GCC 2.95/3.3 builds
    • Fix CMake 3.27 deprecation warnings
    • Fix XCode 14 sprintf deprecation warning when compiling in C++03 mode
    • Fix clang/gcc warnings -Wweak-vtables, -Wreserved-macro-identifier

    Thanks to @DavidKorczynski, @jiangqucheng, @SoapGentoo, @asmaloney, @ArchXUser, @stefanroellin and @vineethkuttan for contributions!

    Downloads
  • v1.13 a0e0643363

    v1.13 Stable

    archiver-bot released this 2022-10-28 18:53:25 -05:00 | 197 commits to master since this release

    Maintenance release.

    Release highlights:

    • xml_attribute::set_value, xml_node::set_value and xml_text::set now have overloads that accept pointer to non-null-terminated string and size
    • Fix error handling in xml_document::save_file that could result in the function succeeding while running out of disk space
    • Fix memory leak during error handling of some out-of-memory conditions during xml_document::load

    Read full changelog

    Downloads
  • v1.12.1 dd50fa5b45

    v1.12.1 Stable

    archiver-bot released this 2022-02-10 10:36:19 -06:00 | 232 commits to master since this release

    Patch release.

    This is identical to v1.12 except that it updates PUGIXML_VERSION macro to 1.12. It can be used in applications where PUGIXML_VERSION is needed, but this update is not critical otherwise.

    Downloads
  • v1.12 314baf6605

    v1.12 Stable

    archiver-bot released this 2022-02-08 22:09:10 -06:00 | 233 commits to master since this release

    Maintenance release.

    Release highlights:

    • Fix xml_document move construction (for C++11) and xml_node iterator signatures (for C++20)
    • Add support for VS2022
    • Reorganize CMake settings to have PUGIXML_ prefix and allow more configuration via CMake options, like choosing compact/wchar_t modes.

    Read full changelog

    Downloads
  • v1.11.4 08b3433180

    v1.11.4 Stable

    archiver-bot released this 2020-12-22 10:41:08 -06:00 | 283 commits to master since this release

    Patch release.

    This patch reintroduces pugixml target for CMake when find_package is used, which was accidentally removed from v1.11.
    It's recommended that pugixml::pugixml target is used instead, but this patch restores pugixml target for existing applications / libraries that depend on it.

    The previous patch, v1.11.3, did not handle repeated attempts to call find_package; this patch fixes that particular corner case.

    Downloads
  • v1.11.3 0e3f1699ff

    v1.11.3 Pre-release

    archiver-bot released this 2020-12-18 11:52:06 -06:00 | 285 commits to master since this release

    Patch release.

    This patch reintroduces pugixml target for CMake when find_package is used, which was accidentally removed from v1.11.
    It's recommended that pugixml::pugixml target is used instead, but this patch restores pugixml target for existing applications / libraries that depend on it.

    The previous patch, v1.11.2, was not compatible with CMake 3.10; this patch restores compatibility with earlier CMake versions when using imported targets.

    Downloads
  • v1.11.2 907955280f

    v1.11.2 Pre-release

    archiver-bot released this 2020-12-14 21:47:56 -06:00 | 287 commits to master since this release

    Patch release.

    This patch reintroduces pugixml target for CMake when find_package is used, which was accidentally removed from v1.11.
    It's recommended that pugixml::pugixml target is used instead, but this patch restores pugixml target for existing applications / libraries that depend on it.

    The previous patch, v1.11.1, was only compatible with CMake 3.18 and up; this patch restores compatibility with earlier CMake versions when using imported targets.

    Downloads
  • v1.11.1 5a0fd5d85f

    v1.11.1 Pre-release

    archiver-bot released this 2020-12-04 18:31:20 -06:00 | 289 commits to master since this release

    Patch release.

    This patch reintroduces pugixml target for CMake when find_package is used, which was accidentally removed from v1.11.
    It's recommended that pugixml::pugixml target is used instead, but this patch restores pugixml target for existing applications / libraries that depend on it.

    Downloads