github zeux/pugixml v1.16

7 hours ago

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!

Don't miss a new pugixml release

NewReleases is sending notifications on new releases.