Witsml21parser
A fast, robust and portable Witsml to BSON parser
Install / Use
/learn @devfabiosilva/Witsml21parserREADME
witsml21parser
A fast, robust and portable Witsml 2.1 to BSON parser
Features
- Fast
- Robust
- Portable (NodeJS | Java/Kotlin | PHP (in development) | Python 3)
- Low dependency libraries.
- No Garbage Collector on parsing
- Low memory allocation/reallocation
- Optimized for C/C++ applications
Before you install
Before you install you need to check these tools:
A Linux based OS
Python >= 3.8 (For Python 3 application)
Python 3 development API (for Python 3 application)
gcc >= 9.4.0
cmake >= 3.16.3
make >= 4.2.1
git >= 2.25.1
execstack >= 1.0 (for Java application)
Java SDK development API (for Java application)
Node JS >= v16.20.2 API (for Node JS)
Downloading
git clone https://github.com/devfabiosilva/witsml21parser.git
Compiling
witsml21parser needs libbson library to be compiled. For first time compiling you need to download and compile dependencies first.
There are two static dependencies:
- libbson
- WITSML 2.1 - ETP validation schemas C code
- Compiling libbson third-party library
make install_bson
For multi-threading fast compiling use -jN option e.g:
make -j12 install_bson
- WITSML 2.1 - ETP validation schemas C code
make pre pre_shared
For multi-threading fast compiling use -jN option e.g:
make -j12 pre pre_shared
- Compiling WITSML 2.1 to BSON parser
After compiling libbson third-party library and WITSML 2.1 - ETP validation schemas C code just type:
make
For multi-threading fast compiling use -jN option e.g:
make -j12
Executing
Just type:
./cws <FILE_NAME>
E.g:
./cws BhaRun.xml
It will convert BhaRun.xml to BhaRun.bson file
- Compiling WITSML 2.1 to BSON parser for Java/Kotlin
To compile native library for Java/Kotlin just type:
make jni
For multi-threading fast compiling use -jN option e.g:
make -j12 jni
Executing Java WITSML 2.1 to BSON parser
Before you run your code you MUST set native library environment.
- Go to Java sources folder
- Execute shell script:
source env.sh
- Open with your favorite IDE and run Java code here
- Run Tests and Aplication
SAMPLE APP jwitsml21cmd-1.0.jar
This app shows how to use WITSML 2.1 BSON parser in Java/Kotlin
Before use
You need to compile JNI
cd <WITSML 2.1 BSON PARSER PROJECT FOLDER>/
make jni
File libjwitsmlparser21.so must be in root project folder.
Compile Java library with maven
cd <WITSML 2.1 BSON PARSER PROJECT FOLDER>/Java/library
mvn -U clean install
Running
cd <WITSML 2.1 BSON PARSER PROJECT FOLDER>/Java/sampleApp
source env.sh
java -jar jwitsml21cmd-1.0.jar <WITSML 2.1 XML FILES>
Examples
java -jar jwitsml21cmd-1.0.jar ../../examples/xmls/OpsReport.xml
Welcome to WITSML 2.1 parser
========================
Opening ../../examples/xmls/OpsReport.xml
Instance name: jWITSMLParser 2.1 - (0x7f599422ab40)
Saving to file OpsReport.json
Saving to file OpsReport.bson
Statistics for "../../examples/xmls/OpsReport.xml":
{arrays=60, booleans=22, costs=9, dateTime=73, doubles=28, enums=55, long64s=47, measures=382, memoryUsed=3160, strings=463, total=1139}
java -jar jwitsml21cmd-1.0.jar ../../examples/xmls/OpsReport.xml ../../examples/xmls/Risk.xml
Welcome to WITSML 2.1 parser
========================
Opening ../../examples/xmls/OpsReport.xml
Instance name: jWITSMLParser 2.1 - (0x7fe87424aba0)
Saving to file OpsReport.json
Saving to file OpsReport.bson
Statistics for "../../examples/xmls/OpsReport.xml":
{arrays=60, booleans=22, costs=9, dateTime=73, doubles=28, enums=55, long64s=47, measures=382, memoryUsed=4532, strings=463, total=1139}
========================
Opening ../../examples/xmls/Risk.xml
Instance name: jWITSMLParser 2.1 - (0x7fe8742a8b30)
Saving to file Risk.json
Saving to file Risk.bson
Statistics for "../../examples/xmls/Risk.xml":
{arrays=12, dateTime=17, enums=14, long64s=9, measures=18, strings=106, total=176}
Executing NodeJS (>=v16.20.2) WITSML 2.1 to BSON parser
Before use (first time only)
You need to compile JS WITSML 2.1 to BSON parser
In your root witsml21parser folder
make nodejs && cd $(pwd)/NodeJS && source env.sh
Running
In your NodeJS folder:
node app.js
Executing Python 3 WITSML 2.1 to BSON parser
Before use (first time only)
You need to compile PyWITSML 2.1 to BSON parser
In your root witsml21parser folder
make py && cd $(pwd)/Python && source env.sh
Running
In your Python folder:
python3 witsml21parser.py
BENCHMARKS
Primary benchmarks in Java had been shown that WITSML 1.4.1.1 parsing objects are 56 % faster than JAXB in Java application.
JAXB only parses XML objects and store their values in respective Java objects. In other hand, WITSML BSON parser not only parses XML objects in C structs but it creates BSON objects, adds objects to BSON, serializes it and parses it to Java native byte object.
But wait! How is WITSML BSON parser faster than JAXB doing more stuffs?
Answer is simple.
- Less allocation/reallocation in memory
- Referencing objects instead create and copy
- gSoap optimization on parsing XML to C structs. See some interesting GENIVIA articles here
- Recycled alloc'd memory
- Low memory usage
- Only two library dependency (gSoap and libbson)
- No garbage collector on parsing objects
SIGNING KEY
Keys for signature:
fabioegel@gmail.com fingerprint: 6E21 A6B6 E1A4 6580 CA00 FA54 1077 26E9 14B9 16A2
LICENSES
This project is fully open source and MIT license.
WARNING
WITSML 2.1 BSON parser needs library with different licenses.
See version.json for details.
DONATIONS
Any donation is welcome.
Consider any amount of donation in BITCOIN: 1JUzcSh3vsBCRji5n5rJsbHQfW3hYrNAW4
Thank you :)
Related Skills
node-connect
350.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
claude-opus-4-5-migration
109.9kMigrate prompts and code from Claude Sonnet 4.0, Sonnet 4.5, or Opus 4.1 to Opus 4.5
frontend-design
109.9kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
model-usage
350.1kUse CodexBar CLI local cost usage to summarize per-model usage for Codex or Claude, including the current (most recent) model or a full model breakdown. Trigger when asked for model-level usage/cost data from codexbar, or when you need a scriptable per-model summary from codexbar cost JSON.
