• Stars
    star
    9
  • Rank 1,878,409 (Top 39 %)
  • Language
    C
  • License
    MIT License
  • Created over 4 years ago
  • Updated about 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

๐Ÿ”‹ In-place lightweight XML parser

๐Ÿ”‹ XML parser for C

Build Status Build status Codacy Badge

This is very simple and very powerful XML parser. It creates DOM-like data structure and allows to iterate and process XML objects very simple way. It does not alloc any memory for XML itself, it only allocs memory for tokens. It also does not use recursive way to build data structure which makes it very fast to build DOM-like tree structure.

Documentation

Almost all functions (inline versions) and parameters are documented inside related headers.
Complete documentation: TODO.

Features

  • header-only or optional compiled library
  • option to store members and arrays as reverse order or normal
  • option to separate xml tag prefix
  • doesn't alloc memory for keys and values only for tokens
  • creates DOM-like data structure to make it easy to iterate though
  • simple api
  • provides some util functions to print xml, get int32, int64, float, double...
  • very small library
  • unique way to parse XML (check the object map section)
  • helper to get string nodes, primitive values (int, float, bool) for both attribs and values

TODOs

  • provide header only library and optionally compile version
  • provide option to preserve array order (currently array order is reversed, because it is easy to parse it in this way; this may be changed. Please follow new commits or releases)
  • provide option to separate tag prefixes
  • windows build
  • documentation
  • handle or ignore comments? (ignored)
  • handle or ignore CDATA? (ignored)
  • cmake
  • tests
  • extra optimizations
  • usage in detail

Build

Unix (Autotools)

sh autogen.sh
./configure
make
[sudo] make install

you can grap library in .libs folder after build finished

Windows (MSBuild)

Windows related build files, project files are located in win folder, make sure you are inside tm/win folder. Code Analysis are enabled, it may take awhile to build

cd win
.\build.bat
Cmake options with Defaults:
option(XML_SHARED "Shared build" ON)
option(XML_STATIC "Static build" OFF)
option(XML_USE_C99 "" OFF) #ย C11 
option(XML_USE_TEST "Enable Tests" OFF) #ย for make check - make test
mkdir build && cd build
cmake ..
make
[sudo] make install

Header-only or Compiled Library

The functions has the xmlc_ prefix are compiled version which is called from library. To use this feature you must include xml/call/xml.h header.

To use header-only library you must include xml/xml.h header. The functions has the xml_ prefix are forced to be inlined. When you use this, you don't have to compile the library.

todo.

Example usage

You can inspect xml_print() to view usage in more detail. The example will be updated later to give more detail.

#include <xml/xml.h>
#include <xml/print.h>

int main(int argc, const char * argv[]) {
  xml_doc_t *doc;
  xml_t     *root;
  
  doc  = xml_parse(/* XML string */, XML_DEFAULTS);
  root = doc->root;

  xml_print_human(stderr, root);

  xml_free(doc);

  return 0;
}
const xml_doc_t *xmlDoc;
const xml_t     *xml;

xmlDoc = xml_parse(/* XML string */, XML_DEFAULTS);
xml    = xmlDoc->root->value;

/* already defined in util.h */
XML_INLINE
bool
xml_tag_eq(const xml_t * __restrict obj, const char * __restrict str);

while (xml) {
    if (xml_key_eq(xml, "tag 1")) {
      int aNumber;

     aNumber = xml_int32(xml, 0);

     /* ... */
    } else if (xml_tag_eq(xml, "tag 2")) {
      const char *nonNullTerminatedString;
      const char *nullTerminatedString;

      /* just pointer */
      nonNullTerminatedString = xml_string(xml);

       /* null-terminated string (strdup), needs to be freed */
      nullTerminatedString    = xml_string_dup(xml);

     /* ... */
    } else if (xml_key_eq(xml, "tag 3")) {
      xml_t *aChild;
      
      aChild = xml->value;
      while (aChild) {
          /* handle child node */
          aChild = aChild->next;
      }
    }

    xml = xml->next;
}

Using Object Map

void
callback_1(xml_t * __restrict xml, void * __restrict obj) {
  printf("entered callback_1\n");
}

xml = xml_parse(/* XML string */, XML_DEFAULTS);

xml_objmap_t objmap[] = {
    {
      .key = "key1",
      .foundFunc = {
        .func = callback_1
      }
    },
    {
      .key = "key2",
      .foundFunc = {
        .func = callback_1
      }
    }
};

/* or you can use macro helpers which is more readable if you don't need more details: */
xml_objmap_t objmap[] = {
    XML_OBJMAP_FN("key 1", func1, param1),
    XML_OBJMAP_FN("key 2", func2, param2),
    XML_OBJMAP_FN("key 3", func3, param3),
    /* ... */
};

xml_objmap_call(xml, objmap, ARRAY_LEN(objmap), NULL);

In this way you don't have to compare keys in a loop, just map the keys with a function or with userdata. You don't have to use function in this way, you may use to map xml object to userdata which may be a GOTO LABEL (to use compound gotos) or something else.

License

MIT. check the LICENSE file

More Repositories

1

cglm

๐Ÿ“ฝ Highly Optimized 2D / 3D Graphics Math (glm) for C
C
2,039
star
2

AssetKit

๐ŸŽจ Modern 2D/3D - Importer โ€ข Exporter โ€ข Util - Library, also known as (AssetIO)
C
178
star
3

cmt

๐ŸŽฎ C Bindings/Wrappers for Apple's METAL framework
C
156
star
4

gkern

๐ŸŽฅ Graphics Kernel: flexible, highly configurable, extensible render engine (realtime + offline)
C
96
star
5

ds

๐Ÿ”— Common Data Structures and Algorithms
C
47
star
6

tm

timers and timeline
C
39
star
7

gpu

๐Ÿ”ญ cross platform general purpose GPU library - optimized for rendering
C
23
star
8

json

๐Ÿ”‹ In-place lightweight JSON parser
C
23
star
9

phy

physics engine written in C
C
9
star
10

im

๐Ÿ“ท image loader library for fast load images especially for rendering and image analysis (In Progress)
C
8
star
11

simple-collada-viewer

A simple viewer to show how to use AssetKit, libgk, assetkit-gl and cglm libraries (with screenshot)
C
6
star
12

mathkit

C vector, matrix library (including 3d, opengl math)
C
5
star
13

libsig

Signal/Event handling lib for C/C++
C++
4
star
14

rays

Physically-based path tracer for production rendering (may include fast ray tracer as altnative render path)
C
4
star
15

asset-xchange

new file format to store 2d/3d assets for game and films
3
star
16

assetkit-gl

Bridge library for loading AssetKit to libgk
C
3
star
17

filt

Image Filter
C
2
star
18

ui

๐Ÿ–ฑ user interface library top of GPU (OpenGL/Metal/Vulkan...)
Objective-C
2
star
19

libui

Cross platform user interface (including graphics) library for C++
C++
1
star
20

netutils

Network Utils for C/C++
C
1
star
21

http

http parser and utility
C
1
star
22

sample-models

3D sample models for loaders (AssetKit) for testing purpose
1
star
23

Qt-Dispatch

C++
1
star