Triggered by a post of Crossroads - output format question - XML? - Programming Questions - Arduino Forum - I wrote a simple library/class that helps to write XML output. Although still work in progress it seemed to me mature enough to post here so I can get feedback about all that is wrong.
Of course an example script to show how it can be used and its output.
Note that the data is made up or quite trivial.
Note the constructor can use any Print derived class, including Stream, Serial, etc (only tested Serial BTW).
XMLWriter XML(&Serial);
//
// FILE: XMLWriterTest.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.01
// PURPOSE: make a simple XML generating lib
// DATE: 2013-11-06
// URL:
//
// Released to the public domain
//
#include <XMLWriter.h>
XMLWriter XML(&Serial);
char buffer[24];
void setup()
{
Serial.begin(115200);
XML.header();
XML.comment("XMLWriterTest.ino\nThis is a demo of a simple XML lib for Arduino", true); // true means multi line here
XML.tagOpen("Arduino", "42");
XML.tagOpen("Ports");
AnalogPorts("before");
DigitalPorts();
AnalogPorts("after");
XML.tagClose();
Weather();
Weather2();
XML.tagClose();
}
void Weather2()
{
XML.comment("The weather in South Africa");
for (int i=0; i<10; i++)
{
XML.tagStart("Weather");
XML.tagField("Date", "20131106");
XML.tagField("Time", "1:42");
XML.tagField("Temp", "23.4");
XML.tagField("Humi", "50%");
XML.tagField("Rain", "10mm");
XML.tagField("Sun", "40");
XML.tagEnd();
}
}
void Weather()
{
XML.comment("The weather in Nebraska");
XML.tagOpen("Weather");
XML.writeNode("Date", "20131106");
XML.writeNode("Time", "11:42");
XML.writeNode("Temp", "23.4");
XML.writeNode("Humi", "50%");
XML.writeNode("Rain", "10mm");
XML.writeNode("Sun", "40");
XML.tagClose();
}
void AnalogPorts(char* name)
{
XML.comment("The analog ports are multiplexed");
XML.tagOpen("Analog", name);
XML.writeNode("Analog0", itoa(analogRead(A0), buffer, 10));
XML.writeNode("Analog1", analogRead(A1));
XML.writeNode("Analog2", (5.0*analogRead(A2))/1023); // default nr decimals float = 2
XML.writeNode("Analog2", (5.0*analogRead(A2))/1023, 3);
XML.tagClose();
}
void DigitalPorts()
{
XML.comment("The digital ports are not multiplexed");
XML.tagOpen("Digital");
XML.writeNode("D1", itoa(digitalRead(1), buffer, 10));
XML.writeNode("D13", digitalRead(13));
XML.tagClose();
}
void loop()
{
}
The output looks as follows:
<?xml version="1.0" encoding="UTF-8"?>
<!--
XMLWriterTest.ino
This is a demo of a simple XML lib for Arduino
-->
<Arduino name="42">
<Ports>
<!-- The analog ports are multiplexed -->
<Analog name="before">
<Analog0>448</Analog0>
<Analog1>362</Analog1>
<Analog2>1.52</Analog2>
<Analog2>1.584</Analog2>
</Analog>
<!-- The digital ports are not multiplexed -->
<Digital>
<D1>0</D1>
<D13>0</D13>
</Digital>
<!-- The analog ports are multiplexed -->
<Analog name="after">
<Analog0>393</Analog0>
<Analog1>428</Analog1>
<Analog2>2.08</Analog2>
<Analog2>1.994</Analog2>
</Analog>
</Ports>
<!-- The weather in Nebraska -->
<Weather>
<Date>20131106</Date>
<Time>11:42</Time>
<Temp>23.4</Temp>
<Humi>50%</Humi>
<Rain>10mm</Rain>
<Sun>40</Sun>
</Weather>
<!-- The weather in South Africa -->
<Weather Date="20131106" Time="1:42" Temp="23.4" Humi="50%" Rain="10mm" Sun="40"/>
<Weather Date="20131106" Time="1:42" Temp="23.4" Humi="50%" Rain="10mm" Sun="40"/>
<Weather Date="20131106" Time="1:42" Temp="23.4" Humi="50%" Rain="10mm" Sun="40"/>
<Weather Date="20131106" Time="1:42" Temp="23.4" Humi="50%" Rain="10mm" Sun="40"/>
<Weather Date="20131106" Time="1:42" Temp="23.4" Humi="50%" Rain="10mm" Sun="40"/>
<Weather Date="20131106" Time="1:42" Temp="23.4" Humi="50%" Rain="10mm" Sun="40"/>
<Weather Date="20131106" Time="1:42" Temp="23.4" Humi="50%" Rain="10mm" Sun="40"/>
<Weather Date="20131106" Time="1:42" Temp="23.4" Humi="50%" Rain="10mm" Sun="40"/>
<Weather Date="20131106" Time="1:42" Temp="23.4" Humi="50%" Rain="10mm" Sun="40"/>
<Weather Date="20131106" Time="1:42" Temp="23.4" Humi="50%" Rain="10mm" Sun="40"/>
</Arduino>
Source see - Arduino/libraries/XMLWriter at master · RobTillaart/Arduino · GitHub -
As always comments and remarks and improvements and ... are welcome.
(and no an XMLreader is not yet in the planning