143 lines
4.7 KiB
Markdown
Raw Normal View History

2021-01-29 12:31:58 +01:00
[![Arduino CI](https://github.com/RobTillaart/XMLWriter/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci)
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/XMLWriter/blob/master/LICENSE)
[![GitHub release](https://img.shields.io/github/release/RobTillaart/XMLWriter.svg?maxAge=3600)](https://github.com/RobTillaart/XMLWriter/releases)
2020-05-25 09:58:04 +02:00
# XMLWriter
Arduino Library to create simple XML (messages, files, print, ...)
## Description
The XMLWriter class supports generating XML files and send these over a stream
like Ethernet SD.File or Serial.
When instantiating an XMLWriter one can define the internal buffer size.
2020-11-27 11:33:55 +01:00
A bigger buffer will make the output faster, especially for Ethernet and SD.File.
The buffer size should be at least 2 bytes and max 250.
2021-01-29 12:31:58 +01:00
How much faster depends on the properties of the stream and the platform used.
2020-05-25 09:58:04 +02:00
E.g. the baudrate and internal buffer of Serial, packet behaviour of Ethernet,
or paging of SD cards.
2020-11-27 11:33:55 +01:00
If performance is low one should do testruns with different sizes for the buffer
and choose one that is appropriate.
2020-05-25 09:58:04 +02:00
Indicative sizes based upon the examples.
Run your tests to find your application optimum.
| STREAM | SIZE |
|:------------|:----------|
| Ethernet | 20-30 |
| Serial | 5 |
| SD File | 10-16 |
2021-01-29 12:31:58 +01:00
**IMPORTANT:** When using buffering you should always call **XML.flush()**
at the end of the XML generation. This will flush the last bytes in the internal buffer into the output stream.
2020-11-27 11:33:55 +01:00
## Interface
2021-01-29 12:31:58 +01:00
### Constructor
2020-11-27 11:33:55 +01:00
- **XMLWriter(stream, bufsize);** Constructor defines the stream and the buffersize
to optimize performance vs memory usage.
2021-01-29 12:31:58 +01:00
### Functions for manual layout control
- **setIndentSize(size = 2)** preferred a multiple of 2; no limit
- **getIndentSize()** returns set indent
- **incrIndent()** increments indent by 2 spaces
- **decrIndent()** decrements indent by 2 spaces
- **indent()** manually indent output
2020-11-27 11:33:55 +01:00
- **raw(str)** inject any string
2021-01-29 12:31:58 +01:00
### General settings
2020-11-27 11:33:55 +01:00
- **setConfig(cfg)** used to show/strip comment, indent, newLine.
use **setConfig(0);** to minimize the output
- **newLine(n)** add a number of newlines to the output, default = 1
2021-01-29 12:31:58 +01:00
### Functions
- **header()** injects standard XML header string, must be first line
2020-11-27 11:33:55 +01:00
- **reset()** resets internal state, to be called before new XML is written
- **comment(text, multiline)** \<!-- text --\>
if multiline == true it does not indent to allow bigger text blocks
2021-01-29 12:31:58 +01:00
multiline is default false.
2020-11-27 11:33:55 +01:00
- **flush()** call flush() at the end of writing to empty the internal buffer. **!!**
2021-01-29 12:31:58 +01:00
### Functions to create simple tags with named fields
2020-11-27 11:33:55 +01:00
- **tagOpen(tag, newLine)** \<tag\>
- **tagOpen(tag, name, newLine)** \<tag name="name"\>
2021-01-29 12:31:58 +01:00
- **tagClose()** \</tag\>
### Functions to make up tags with multiple fields
2020-11-27 11:33:55 +01:00
- **tagStart(tag)** \<tag
- **tagField(field, string);** field="string"
2021-01-29 12:31:58 +01:00
- **tagField(field, T value, base = DEC);** standard math types, field="value"
2020-11-27 11:33:55 +01:00
- **tagEnd(newline = true, addSlash = true);** /\>
2021-01-29 12:31:58 +01:00
### Functions to make a node
2020-11-27 11:33:55 +01:00
- **writeNode(tag, value);** \<tag\>value\</tag\>
- **writeNode(tag, T value, base = DEC);** standard math types
2021-01-29 12:31:58 +01:00
### Helper
2020-11-27 11:33:55 +01:00
- **escape(str)** expands the xml chars: \"\'\<\>\&
2021-01-29 12:31:58 +01:00
### Metrics and debug
To optimize buffersize in combination with timing.
2020-11-27 11:33:55 +01:00
- **bufferIndex()** returns the size of the internal buffer
- **bytesWritten()** idem, since reset().
2021-01-29 12:31:58 +01:00
- **version()** injects the XMLWRITER_VERSION as comment in outputstream.
- **debug()** injects comment with internal info.
2020-11-27 11:33:55 +01:00
## Print interface
XMLWriter 0.2.4 implements the Print interface, so at any moment one can use
**print()** or **println()** to inject specific information.
2021-01-29 12:31:58 +01:00
Note that **tagField()** and **writeNode()** do not support 64 bit integer
2020-11-27 11:33:55 +01:00
types and large values of double.
My **printHelpers library** helps to convert these to strings which can be printed.
See example.
The Print interface can also be used to print objects that
implement the **Printable** interface. See example.
With the support of the Print interface, **raw()** is becoming obsolete as it only
can inject strings.
2021-01-29 12:31:58 +01:00
2020-11-27 11:33:55 +01:00
## Configuration flags
| Flag | Value | Meaning |
|:----|:----|:----|
|XMLWRITER_NONE | 0x00 | minimize output, smaller & faster |
|XMLWRITER_COMMENT | 0x01 | allow comments |
|XMLWRITER_INDENT | 0x02 | allow indentation |
|XMLWRITER_NEWLINE | 0x04 | allow newlines |
- **setConfig(XMLWRITER_NONE);** to minimize the output in bytes.
- **setConfig(XMLWRITER_NEWLINE);** to break an XML stream in lines.
- **setConfig(XMLWRITER_NEWLINE | XMLWRITER_INDENT);** to see XML structure.
- **setConfig(XMLWRITER_NEWLINE | XMLWRITER_INDENT | XMLWRITER_COMMENT);** to see XML structure + comments.
2020-05-25 09:58:04 +02:00
2021-01-29 12:31:58 +01:00
2020-05-25 09:58:04 +02:00
## Operation
See examples