Expat - a C library for parsing XML

Overview

Travis CI Build Status AppVeyor Build Status Packaging status

Expat, Release 2.2.10

This is Expat, a C library for parsing XML, started by James Clark in 1997. Expat is a stream-oriented XML parser. This means that you register handlers with the parser before starting the parse. These handlers are called when the parser discovers the associated structures in the document being parsed. A start tag is an example of the kind of structures for which you may register handlers.

Expat supports the following compilers:

  • GNU GCC >=4.5
  • LLVM Clang >=3.5
  • Microsoft Visual Studio >=12.0/2013

Windows users can use the expat_win32 package, which includes both precompiled libraries and executables, and source code for developers.

Expat is free software. You may copy, distribute, and modify it under the terms of the License contained in the file COPYING distributed with this package. This license is the same as the MIT/X Consortium license.

If you are building Expat from a check-out from the Git repository, you need to run a script that generates the configure script using the GNU autoconf and libtool tools. To do this, you need to have autoconf 2.58 or newer. Run the script like this:

./buildconf.sh

Once this has been done, follow the same instructions as for building from a source distribution.

To build Expat from a source distribution, you first run the configuration shell script in the top level distribution directory:

./configure

There are many options which you may provide to configure (which you can discover by running configure with the --help option). But the one of most interest is the one that sets the installation directory. By default, the configure script will set things up to install libexpat into /usr/local/lib, expat.h into /usr/local/include, and xmlwf into /usr/local/bin. If, for example, you'd prefer to install into /home/me/mystuff/lib, /home/me/mystuff/include, and /home/me/mystuff/bin, you can tell configure about that with:

./configure --prefix=/home/me/mystuff

Another interesting option is to enable 64-bit integer support for line and column numbers and the over-all byte index:

./configure CPPFLAGS=-DXML_LARGE_SIZE

However, such a modification would be a breaking change to the ABI and is therefore not recommended for general use — e.g. as part of a Linux distribution — but rather for builds with special requirements.

After running the configure script, the make command will build things and make install will install things into their proper location. Have a look at the Makefile to learn about additional make options. Note that you need to have write permission into the directories into which things will be installed.

If you are interested in building Expat to provide document information in UTF-16 encoding rather than the default UTF-8, follow these instructions (after having run make distclean). Please note that we configure with --without-xmlwf as xmlwf does not support this mode of compilation (yet):

  1. Mass-patch Makefile.am files to use libexpatw.la for a library name:
    find -name Makefile.am -exec sed -e 's,libexpat\.la,libexpatw.la,' -e 's,libexpat_la,libexpatw_la,' -i {} +

  2. Run automake to re-write Makefile.in files:
    automake

  3. For UTF-16 output as unsigned short (and version/error strings as char), run:
    ./configure CPPFLAGS=-DXML_UNICODE --without-xmlwf
    For UTF-16 output as wchar_t (incl. version/error strings), run:
    ./configure CFLAGS="-g -O2 -fshort-wchar" CPPFLAGS=-DXML_UNICODE_WCHAR_T --without-xmlwf
    Note: The latter requires libc compiled with -fshort-wchar, as well.

  4. Run make (which excludes xmlwf).

  5. Run make install (again, excludes xmlwf).

Using DESTDIR is supported. It works as follows:

make install DESTDIR=/path/to/image

overrides the in-makefile set DESTDIR, because variable-setting priority is

  1. commandline
  2. in-makefile
  3. environment

Note: This only applies to the Expat library itself, building UTF-16 versions of xmlwf and the tests is currently not supported.

When using Expat with a project using autoconf for configuration, you can use the probing macro in conftools/expat.m4 to determine how to include Expat. See the comments at the top of that file for more information.

A reference manual is available in the file doc/reference.html in this distribution.

The CMake build system is still experimental and will replace the primary build system based on GNU Autotools at some point when it is ready. For an idea of the available (non-advanced) options for building with CMake:

# rm -f CMakeCache.txt ; cmake -D_EXPAT_HELP=ON -LH . | grep -B1 ':.*=' | sed 's,^--$,,'
// Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ...
CMAKE_BUILD_TYPE:STRING=

// Install path prefix, prepended onto install directories.
CMAKE_INSTALL_PREFIX:PATH=/usr/local

// Path to a program.
DOCBOOK_TO_MAN:FILEPATH=/usr/bin/docbook2x-man

// build man page for xmlwf
EXPAT_BUILD_DOCS:BOOL=ON

// build the examples for expat library
EXPAT_BUILD_EXAMPLES:BOOL=ON

// build fuzzers for the expat library
EXPAT_BUILD_FUZZERS:BOOL=OFF

// build pkg-config file
EXPAT_BUILD_PKGCONFIG:BOOL=ON

// build the tests for expat library
EXPAT_BUILD_TESTS:BOOL=ON

// build the xmlwf tool for expat library
EXPAT_BUILD_TOOLS:BOOL=ON

// Character type to use (char|ushort|wchar_t) [default=char]
EXPAT_CHAR_TYPE:STRING=char

// install expat files in cmake install target
EXPAT_ENABLE_INSTALL:BOOL=ON

// Use /MT flag (static CRT) when compiling in MSVC
EXPAT_MSVC_STATIC_CRT:BOOL=OFF

// build fuzzers via ossfuzz for the expat library
EXPAT_OSSFUZZ_BUILD:BOOL=OFF

// build a shared expat library
EXPAT_SHARED_LIBS:BOOL=ON

// Treat all compiler warnings as errors
EXPAT_WARNINGS_AS_ERRORS:BOOL=OFF

// Make use of getrandom function (ON|OFF|AUTO) [default=AUTO]
EXPAT_WITH_GETRANDOM:STRING=AUTO

// utilize libbsd (for arc4random_buf)
EXPAT_WITH_LIBBSD:BOOL=OFF

// Make use of syscall SYS_getrandom (ON|OFF|AUTO) [default=AUTO]
EXPAT_WITH_SYS_GETRANDOM:STRING=AUTO
Comments
  • How to use expat for embedded processors

    How to use expat for embedded processors

    Hi, I needed to use expat in an STM32 application written in C. The project is compiled in Embitz in Windows for STM32 target. I tried to follow the example code of e.g. element.c within my porject but start and end element handler never get called. Although if I try to compile it with CMake for windows as separate application and give xml file as parameter to compile *.exe example it parses the xml file correctly. Do I have to have some special defines for embedded targets as STM32? Initially I was having assertion due Hash salt but then I set the hash salth using XML_SetHashSatl(parser, 1) which helped. But still the start and end element handler never get called when I run my project in embedded target.

    question 
    opened by ataulghalib 25
  • building expat 2.4.8 on windows using static runtime fails

    building expat 2.4.8 on windows using static runtime fails

    Trying to upgrade to the latest version of expat using MSVC 2022, I find it impossible to link against expat, when compiled with the static runtime options. Here my cmake variables:

      set (EXPAT_SHARED_LIBS OFF)
      set (EXPAT_BUILD_EXAMPLES OFF)
      set (EXPAT_BUILD_TESTS OFF)
      set (EXPAT_BUILD_TOOLS OFF)
      set (EXPAT_BUILD_TOOLS OFF)
      if (WITH_STATIC_RUNTIME)
        #expat is overriding this, so enforce it to be
        set(EXPAT_MSVC_STATIC_CRT ON CACHE BOOL "Use /MT flag (static CRT) when compiling in MSVC" FORCE)
      endif()
    

    Unfortunately, when trying to link against the library, i get an undefined symbol:

    libexpat.lib(xmlparse.c.obj) : error LNK2019: unresolved external symbol __imp_rand_s referenced in function generate_hash_secret_salt
    

    additionally there are warnings, that indicate that the static runtime seems to be ignored:

    LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
    LINK : warning LNK4217: symbol '_errno' defined in 'libucrt.lib(errno.obj)' is imported by 'libexpat.lib(xmlparse.c.obj)' in function 'ENTROPY_DEBUG'
    LINK : warning LNK4217: symbol '__acrt_iob_func' defined in 'libucrt.lib(_file.obj)' is imported by 'libexpat.lib(xmlparse.c.obj)' in function 'ENTROPY_DEBUG'
    LINK : warning LNK4217: symbol '__stdio_common_vfprintf' defined in 'libucrt.lib(output.obj)' is imported by 'libexpat.lib(xmlparse.c.obj)' in function '_vfprintf_l'
    LINK : warning LNK4217: symbol 'free' defined in 'libucrt.lib(free.obj)' is imported by 'libexpat.lib(xmlparse.c.obj)' in function 'parserCreate'
    LINK : warning LNK4217: symbol 'malloc' defined in 'libucrt.lib(malloc.obj)' is imported by 'libexpat.lib(xmlparse.c.obj)' in function 'parserCreate'
    LINK : warning LNK4217: symbol 'realloc' defined in 'libucrt.lib(realloc.obj)' is imported by 'libexpat.lib(xmlparse.c.obj)' in function 'parserCreate'
    LINK : warning LNK4217: symbol 'strtoul' defined in 'libucrt.lib(strtox.obj)' is imported by 'libexpat.lib(xmlparse.c.obj)' in function 'ENTROPY_DEBUG'
    LINK : warning LNK4217: symbol 'getenv' defined in 'libucrt.lib(getenv.obj)' is imported by 'libexpat.lib(xmlparse.c.obj)' in function 'ENTROPY_DEBUG'
    
    question compilation windows 
    opened by fbergmann 21
  • Make us able to drop GNU Autotools (in favor of CMake), then drop it

    Make us able to drop GNU Autotools (in favor of CMake), then drop it

    Before we can drop GNU Autotools, we need at least:

    • [x] (1) Get MinGW support working in CMake — #334
    • [x] (2) Add support for make run-xmltest to CMake, including test execution using Wine — depends on (1) — #334
    • [x] (3) Migrate coverage.sh to use CMake — depends on (1) and (2), #357
    • [x] (4) Migrate qa.sh to use CMake — depends on (1) and (2)
    • [x] (5) Replace all remaining Autotools bits in Travis CI by CMake — depends on (1) and (2), potentially also on (4)
    • [ ] (6) Port all remaining needed bits from configure.ac / Makefile.am to CMake
    • [x] (7) Drop ~or adapt~ expat.spec RPM upstream package — ccd1cbc14db64f81f7404c5da37e1a9b9fa6de3b
    • [x] (8) Implement equivalent to make distcheck for CMake — depends on (2)
    • [x] (9) Port distribute.sh to use CMake — depends on (8)
    • [ ] (10) Compare expat_config.h before and after —in part addressed by #437
    • [ ] (11) Check CMake variables names for namespace prefix and and visibility

    If you want to help with some of these, please get in touch to discuss further details before you start. Thank you!

    enhancement compilation 
    opened by hartwork 21
  • xmlwf: Add argument -k to allow continuing after non-fatal errors

    xmlwf: Add argument -k to allow continuing after non-fatal errors

    I'm working on a filter to convert hundreds and hundreds of files to XML. To test it, I want to convert them and quickly find out if there were any errors that generated bad XML. At the moment, xmlwf stops after encountering the first file with an error. The -k option instructs xmlwf to continue processing. It's been super helpful to my test setup.

    enhancement 
    opened by timbray 20
  • Allow bypassing auto-detection of function getrandom (for both Autotools and CMake build systems)

    Allow bypassing auto-detection of function getrandom (for both Autotools and CMake build systems)

    Hi!

    I would like to report an issue I am having while trying to update the Expat dependency in the Exiv2 project, from the version 2.2.5 to the version 2.2.6.

    In Exiv2 we bring the expat dependency (and others) with conan. I actually wrote a conan recipe for expat which is maintained here: https://github.com/Pix4D/conan-expat

    As you can see here, in this Exiv2 branch I am just trying to bump the expat version from 2.2.5 to 2.2.6: https://github.com/Exiv2/exiv2/compare/master...piponazo:expat226

    And by just doing that change, one of our travis CI jobs started to fail with this error message:

    [ 52%] Linking CXX executable ../bin/exiv2
    ../lib/libexiv2.so.0.27.0.2: undefined reference to `getrandom'
    

    This is just happening for the Linux job (Ubuntu 14.04) with clang-5. The rest of jobs in the matrix compile the project correctly: https://travis-ci.org/piponazo/exiv2/builds/458033518

    I saw that there are other issues related somehow with the getrandom function (for example #172). I would like to know if I need to add some definition (and which one) to solve this issue.

    Thanks in advance! 😸

    enhancement help wanted 
    opened by piponazo 20
  • RFE: bulk xml facilities

    RFE: bulk xml facilities

    This PR proposes an enhancement for ability to parse multiple XMLs in single stream, file, dump or data buffer in one go (so called bulk-XML parsing).

    This solution is part of similar RFE for tdom Tcl-module, which is using libexpat. Thus to avoid possible maintenance or merge issue, we'd like to see the related changes as part of libexpat.

    The change is totally backwards compatible and behaves completely as before if the BulkXMLEnd-handler is not set (it'd still throw an error XML_ERROR_JUNK_AFTER_DOC_ELEMENT by further XML data in stream as libexpat always did it). If BulkXMLEnd-handler becomes set (with new function XML_SetBulkXMLEndHandler), the bulk-parsing will be enabled and parser is able to process multiple XMLs in single stream in one go. In this case the BulkXMLEnd-handler will be invoked after every fulfilled chunk XML if it was successfully parsed to the end of chunk. So if stream or file contains 100 XMLs, this handler will be called 100 times after every processed XML.

    The test-cases of tdom (tcl-side) illustrating the behavior could be found here.

    opened by sebres 19
  • Fix miscellaneous Clang and Cppcheck 2.9 style warnings

    Fix miscellaneous Clang and Cppcheck 2.9 style warnings

    I'm really not familiar with the codebase, so please review carefully. libexpat is a dependency of a dependency of a dependency for me, and I'm just trying to get everything building with more warnings fixed.

    The _GNU_SOURCE thing in particular could maybe be addressed differently. Perhaps it doesn't need to be defined at all?

    enhancement 
    opened by seanm 17
  • [W.I.P.] Continuous Fuzzing with Fuzzit

    [W.I.P.] Continuous Fuzzing with Fuzzit

    Hi @hartwork,

    The integration is ready for first review.

    Also, you can go ahead and sign-up at https://app.fuzzit.dev so I'll be able to add you to the libexpat organization so you can receive emails if anything pops up (Until our Github integration is ready:))

    CCing @catenacyber who worked on the PR

    enhancement 
    opened by yevgenypats 17
  • Windows:  rand_s() instead of loadlibrary convolution?

    Windows: rand_s() instead of loadlibrary convolution?

    Is there a specific reason that the current implementation does not just use the published rand_s() API call (which uses RtlGenRandom) and instead rolls its own dynamic library load to call RtlGenRandom?

    https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/rand-s?view=vs-2019

    EDIT: I'd be happy to submit a patch, because I think it would simplify things quite a bit.

    enhancement windows 
    opened by david-loffredo 16
  • [2.2.{1,2}] Windows LoadLibrary DLL hijacking vulnerability (CVE-2017-11742)

    [2.2.{1,2}] Windows LoadLibrary DLL hijacking vulnerability (CVE-2017-11742)

    Starting with 2.2.1, libexpat added a LoadLibrary() call to load the ADVAPI32.DLL Windows system DLL to improve random numbers. This call however is prone to a known DLL hijacking vulnerability, with no (trivial) way to opt-out from this by apps making use of libexpat. The attack works by building a tailor-made ADVAPI32.DLL that exports the function required and called by libexpat, and copying that DLL to the directory of the user application or to the current directory.

    My (already proposed in https://github.com/libexpat/libexpat/pull/62) patch is this:

    --- expat.orig/xmlparse.c	2017-07-12 21:55:49.000000000 +0000
    +++ expat/xmlparse.c	2017-07-14 19:46:29.000000000 +0000
    @@ -777,6 +779,10 @@
     
     typedef BOOLEAN (APIENTRY *RTLGENRANDOM_FUNC)(PVOID, ULONG);
     
    +#ifndef LOAD_LIBRARY_SEARCH_SYSTEM32
    +# define LOAD_LIBRARY_SEARCH_SYSTEM32  0x00000800
    +#endif
    +
     /* Obtain entropy on Windows XP / Windows Server 2003 and later.
      * Hint on RtlGenRandom and the following article from libsodioum.
      *
    @@ -786,7 +792,7 @@
     static int
     writeRandomBytes_RtlGenRandom(void * target, size_t count) {
       int success = 0;  /* full count bytes written? */
    -  const HMODULE advapi32 = LoadLibrary(TEXT("ADVAPI32.DLL"));
    +  const HMODULE advapi32 = LoadLibraryEx(TEXT("ADVAPI32.DLL"), NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
     
       if (advapi32) {
         const RTLGENRANDOM_FUNC RtlGenRandom
    

    It will resolve the problem for Windows Vista and newer versions, thus covering all officially supported versions of Windows. For older versions the generally recommended method is to detect SYSTEM32 directory and prepend that to the loaded DLL name.

    security 
    opened by vszakats 16
  • Solaris and error: 'NAN' was not declared in this scope

    Solaris and error: 'NAN' was not declared in this scope

    Hi Everyone,

    I'm updating OpenSSH on Solaris 11.4 i86. libexpat is a dependency. libexpat 2.4.5 is having a little trouble:

    $ make check -k
    ...
    /bin/g++ -DHAVE_CONFIG_H -I. -I..   -DXML_ENABLE_VISIBILITY=1 -I./../lib -I/opt/ssh/incl
    ude -DNDEBUG -Wall   -fexceptions -fno-strict-aliasing -g2 -O2 -m64 -march=native -fPIC
    -pthread -MT runtestspp.o -MD -MP -MF .deps/runtestspp.Tpo -c -o runtestspp.o runtestspp
    .cpp
    In file included from runtestspp.cpp:36:0:
    runtests.c: In function 'void test_billion_laughs_attack_protection_api()':
    runtests.c:11712:32: error: 'NAN' was not declared in this scope
              parserWithoutParent, NAN)
                                   ^
    runtests.c:11734:32: error: 'INFINITY' was not declared in this scope
              parserWithoutParent, INFINITY)
                                   ^
    *** Error code 1
    

    This patch appears to clear the issue. The self tests build and run without problems:

    $ cat expat.patch 
    --- tests/runtests.c
    +++ tests/runtests.c 
    @@ -60,6 +60,16 @@
     #  include <stdbool.h>
     #endif
     
    +#if defined(__sun__)
    +#  include <sunmath.h>
    +#  if ! defined(INFINITY)
    +#    define INFINITY (__builtin_huge_val())
    +#  endif
    +#  if ! defined(NAN)
    +#    define NAN (__builtin_nan(""))
    +#  endif
    +#endif
    +
     #include "expat.h"
     #include "chardata.h"
     #include "structdata.h"
    @@ -6636,7 +6646,8 @@
       XML_Char **elemstr = (XML_Char **)userData;
       if (xcstrcmp(elemstr[0], name) != 0) {
         char buffer[1024];
    -    sprintf(buffer, "unexpected end string: '%" XML_FMT_STR "'", name);
    +    snprintf(buffer, sizeof(buffer), "unexpected end string: '%" XML_FMT_STR "'", name);
    +    buffer[sizeof(buffer)-1] = '\0';  /* ensure NULL termination */
         fail(buffer);
       }
       triplet_end_flag = XML_TRUE;
    
    opened by noloader 15
  • Autotools: Fix looking up expat through CMake on systems where triplet are part of the path

    Autotools: Fix looking up expat through CMake on systems where triplet are part of the path

    On systems like Flatpak and Debian, the cmake file is installed under a subdirectory including an extra level for the compiler triplet (e.g. /usr/lib/x86_64-linux-gnu/cmake/expat-2.4.6/expat.cmake). This adds an extra hop in those cases so to cover them.

    An alternative would be to generate it at build time (which is what we do in KDE), but I'm not sure this is really feasible considering that expat has two supported build systems and this approach covers them both.

    Related to https://github.com/libexpat/libexpat/issues/501

    opened by aleixpol 1
  • Rename struct ELEMENT_TYPE to XML_ELEMENT_TYPE to avoid name collision

    Rename struct ELEMENT_TYPE to XML_ELEMENT_TYPE to avoid name collision

    In windows the name ELEMENT_TYPE is already used. Therefore there are problems when using libexpat in VisualStudio (winioctl.h). Changing the name of the struct ELEMENT_TYPE to XML_ELEMENT_TYPE in xmlparse.c would solve this problem.

    opened by Krausal 3
  • GitHub Actions: Add CIFuzz integration

    GitHub Actions: Add CIFuzz integration

    Add CIFuzz workflow action to have fuzzers build and run on each PR.

    This is a service offered by OSS-Fuzz where Expat already runs. CIFuzz can help detect catch regressions and fuzzing build issues early, and has a variety of features (see the URL above). In the current PR the fuzzers gets build on a pull request and will run for 300 seconds.

    Signed-off-by: David Korczynski [email protected]

    opened by DavidKorczynski 0
  • Refactor coverage and conformance tests

    Refactor coverage and conformance tests

    The existing Expat coverage tests all live in the file tests/runtests.c. This makes for a very large source file, which makes understanding the tests and refactoring for common behaviour very hard. This PR pulls tests/runtests.c apart into a number of separate source files grouping together similar tests, and similar support and handler functions. It does not change the code flow of any of the tests, so does not change the current test coverage.

    Hopefully this will allow us to refactor the tests more easily in the future, for example removing a lot of the duplication in support functions.

    opened by RMJ10 0
  • Suggest fuzzer for XML_Parse() and XML_GetCurrentLineNumber().

    Suggest fuzzer for XML_Parse() and XML_GetCurrentLineNumber().

    /*
     * This fuzzer is generated by UTopia with some manual modifications.
     * (UTopia Project: https://github.com/Samsung/UTopia)
     */
    
    #include <expat.h>
    #include <fstream>
    #include "FuzzedDataProvider.h"
    #include <stdio.h>
    #include <expat.h>
    
    #ifdef XML_LARGE_SIZE
    
    #  define XML_FMT_INT_MOD "ll"
    #else
    #  define XML_FMT_INT_MOD "l"
    #endif
    
    #ifdef XML_UNICODE_WCHAR_T
    #  include <wchar.h>
    #  define XML_FMT_STR "ls"
    #else
    #  define XML_FMT_STR "s"
    #endif
    
    bool
    saveFile(std::string Path, std::string Content) {
      std::ofstream OFS(Path);
      if (! OFS.is_open())
        return false;
    
      OFS << Content;
      return true;
    }
    
    static void XMLCALL
    startElement(void *userData, const XML_Char *name, const XML_Char **atts) {
      int i;
      int *depthPtr = (int *)userData;
      (void)atts;
    
      for (i = 0; i < *depthPtr; i++)
        putchar('\t');
      printf("%" XML_FMT_STR "\n", name);
      *depthPtr += 1;
    }
    
    static void XMLCALL
    endElement(void *userData, const XML_Char *name) {
      int *depthPtr = (int *)userData;
      (void)name;
    
      *depthPtr -= 1;
    }
    
    void
    fuzz_expat(FuzzedDataProvider &provider) {
      auto input = provider.ConsumeRemainingBytesAsString();
      const char *file_name = "input";
      saveFile(file_name, input);
    
      char buf[BUFSIZ];
      XML_Parser parser = XML_ParserCreate(NULL);
      int done;
      int depth = 0;
    
      XML_SetUserData(parser, &depth);
      XML_SetElementHandler(parser, startElement, endElement);
    
      FILE *fp = fopen(file_name, "r");
      if (! fp)
        return;
      do {
        size_t len = fread(buf, 1, sizeof(buf), fp);
        done = len < sizeof(buf);
        if (XML_Parse(parser, buf, (int)len, done) == XML_STATUS_ERROR) {
          XML_ErrorString(XML_GetErrorCode(parser));
          XML_GetCurrentLineNumber(parser);
          XML_ParserFree(parser);
          return;
        }
      } while (! done && ! feof(fp));
      XML_ParserFree(parser);
      fclose(fp);
      return;
    }
    
    extern "C" int
    LLVMFuzzerTestOneInput(const uint8_t *data, uint32_t size) {
      FuzzedDataProvider provider(data, size);
      fuzz_expat(provider);
      return 0;
    }
    
    opened by autofuzzoss 1
  • Fuzzer

    Fuzzer

    The existing fuzzers don't cover very much of the possible state, and they don't test the validity of any of the arguments passed to the callback functions, so I wrote a more thorough fuzzer.

    opened by c01db33f 0
Releases(R_2_5_0)
Owner
Expat development team
Expat development team
Tiny XML library.

Mini-XML Version 3.2 Mini-XML is a small XML parsing library that you can use to read XML data files or strings in your application without requiring

Michael R Sweet 371 Dec 29, 2022
A library to serialize custom classes to and from XML by adding a very minimal amount of code to a class.

ai-xml submodule This repository is a git submodule providing a C++ framework for serializing classes to and from XML with a minimal amount of code pe

Carlo Wood 2 Oct 1, 2022
TinyXML2 is a simple, small, efficient, C++ XML parser that can be easily integrated into other programs.

TinyXML-2 TinyXML-2 is a simple, small, efficient, C++ XML parser that can be easily integrated into other programs. The master is hosted on github: h

Lee Thomason 4.3k Dec 27, 2022
pugixml is a Light-weight, simple and fast XML parser for C++ with XPath support

pugixml is a C++ XML processing library, which consists of a DOM-like interface with rich traversal/modification capabilities, an extremely fast XML parser which constructs the DOM tree from an XML file/buffer, and an XPath 1.0 implementation for complex data-driven tree queries. Full Unicode support is also available, with Unicode interface variants and conversions between different Unicode encodings (which happen automatically during parsing/saving).

Arseny Kapoulkine 3.3k Jan 8, 2023
C XML Minimalistic Library (CXML) - An XML library for C with a focus on simplicity and ease of use.

cxml (C XML Minimalistic Library) is a powerful and flexible XML library for C with a focus on simplicity and ease of use, coupled with features that enables quick processing of XML documents.

null 29 Dec 26, 2022
C++ reflection library with Lua binding, and JSON and XML serialisation.

Ponder Linux & OSX: - Windows: Currents status: 3.2-alpha. API is unstable as features added/changed. New: Version 3 V1 replaced Boost with C++11. V2

Bill Quith 573 Dec 28, 2022
Tiny XML library.

Mini-XML Version 3.2 Mini-XML is a small XML parsing library that you can use to read XML data files or strings in your application without requiring

Michael R Sweet 371 Dec 29, 2022
The libxo library allows an application to generate text, XML, JSON, and HTML output using a common set of function calls. The application decides at run time which output style should be produced.

libxo libxo - A Library for Generating Text, XML, JSON, and HTML Output The libxo library allows an application to generate text, XML, JSON, and HTML

Juniper Networks 253 Dec 10, 2022
A library to serialize custom classes to and from XML by adding a very minimal amount of code to a class.

ai-xml submodule This repository is a git submodule providing a C++ framework for serializing classes to and from XML with a minimal amount of code pe

Carlo Wood 2 Oct 1, 2022
A library to handle Apple Property List format in binary or XML

libplist A small portable C library to handle Apple Property List files in binary or XML format. Features The project provides an interface to read an

libimobiledevice 433 Dec 26, 2022
A small C library for building user interfaces with C, XML and CSS

LCUI A small C library for building user interfaces with C, XML and CSS. Table of contents Table of contents Introduction Features Screenshots Related

Liu 3.9k Dec 27, 2022
GPU Accelerated C++ User Interface, with WYSIWYG developing tools, XML supports, built-in data binding and MVVM features.

GacUI GPU Accelerated C++ User Interface, with WYSIWYG developing tools, XML supports, built-in data binding and MVVM features. Read the LICENSE first

Vczh Libraries 2.1k Jan 7, 2023
TinyXML2 is a simple, small, efficient, C++ XML parser that can be easily integrated into other programs.

TinyXML-2 TinyXML-2 is a simple, small, efficient, C++ XML parser that can be easily integrated into other programs. The master is hosted on github: h

Lee Thomason 4.3k Dec 27, 2022
pugixml is a Light-weight, simple and fast XML parser for C++ with XPath support

pugixml is a C++ XML processing library, which consists of a DOM-like interface with rich traversal/modification capabilities, an extremely fast XML parser which constructs the DOM tree from an XML file/buffer, and an XPath 1.0 implementation for complex data-driven tree queries. Full Unicode support is also available, with Unicode interface variants and conversions between different Unicode encodings (which happen automatically during parsing/saving).

Arseny Kapoulkine 3.3k Jan 8, 2023
convert json/xml/bson to c++ struct

xpack 用于在C++结构体和json/xml之间互相转换, bson在xbson中支持。 只需要头文件, 无需编译库文件。 具体可以参考example的例子 基本用法 容器支持 FLAG 别名 位域 继承 枚举 自定义编解码 char数组 第三方类和结构体 格式化缩进 XML数组 Qt支持 重要

null 450 Jan 6, 2023
A C++ binding for the OpenGL API, generated using the gl.xml specification.

glbinding is a cross-platform C++ binding for the OpenGL API. glbinding leverages C++11 features like enum classes, lambdas, and variadic templates, i

CG Internals 758 Dec 13, 2022
XML toolkit from the GNOME project

XML toolkit from the GNOME project

GNOME Github Mirror 413 Jan 2, 2023
An easy-to-use and competitively fast JSON parsing library for C++17, forked from Bitcoin Cash Node's own UniValue library.

UniValue JSON Library for C++17 (and above) An easy-to-use and competitively fast JSON parsing library for C++17, forked from Bitcoin Cash Node's own

Calin Culianu 24 Sep 21, 2022
KoanLogic 400 Dec 25, 2022
C++ library and cmdline tools for parsing and manipulating VCF files

vcflib A C++ library for parsing and manipulating VCF files. overview The Variant Call Format (VCF) is a flat-file, tab-delimited textual format that

null 526 Jan 2, 2023