Wim van der Vegt
/
tinyxml_test
Small demo of TinyXml. TinyXml is a compact library that implements XML Parsing and Manipulation.
main.cpp@1:54c50324309d, 2022-01-18 (annotated)
- Committer:
- wvd_vegt
- Date:
- Tue Jan 18 17:31:23 2022 +0000
- Revision:
- 1:54c50324309d
- Parent:
- 0:091ca51848a0
Initial Commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wvd_vegt | 0:091ca51848a0 | 1 | #include "mbed.h" |
wvd_vegt | 0:091ca51848a0 | 2 | #include "tinyxml.h" |
wvd_vegt | 0:091ca51848a0 | 3 | |
wvd_vegt | 0:091ca51848a0 | 4 | #include <string> |
wvd_vegt | 0:091ca51848a0 | 5 | |
wvd_vegt | 0:091ca51848a0 | 6 | //See http://www.grinninglizard.com/tinyxml/ for more information on how to use tinyxml. |
wvd_vegt | 0:091ca51848a0 | 7 | //See TINYXML Library for license. |
wvd_vegt | 0:091ca51848a0 | 8 | // |
wvd_vegt | 0:091ca51848a0 | 9 | //TODO Document library and app in embed style. |
wvd_vegt | 0:091ca51848a0 | 10 | |
wvd_vegt | 0:091ca51848a0 | 11 | DigitalOut myled(LED1); |
wvd_vegt | 0:091ca51848a0 | 12 | |
wvd_vegt | 0:091ca51848a0 | 13 | int main() { |
wvd_vegt | 0:091ca51848a0 | 14 | |
wvd_vegt | 0:091ca51848a0 | 15 | //Setup Tx, Rx. |
wvd_vegt | 0:091ca51848a0 | 16 | Serial usb(USBTX, USBRX); |
wvd_vegt | 0:091ca51848a0 | 17 | usb.baud(115200); |
wvd_vegt | 0:091ca51848a0 | 18 | |
wvd_vegt | 0:091ca51848a0 | 19 | // Create the local filesystem under the name "local". |
wvd_vegt | 0:091ca51848a0 | 20 | // DO NOT FORGET THIS CALL OR SAVING WON'T WORK! |
wvd_vegt | 0:091ca51848a0 | 21 | LocalFileSystem local("local"); |
wvd_vegt | 0:091ca51848a0 | 22 | |
wvd_vegt | 0:091ca51848a0 | 23 | // Create some Xml to experiment on. |
wvd_vegt | 0:091ca51848a0 | 24 | const char* demoStart = |
wvd_vegt | 0:091ca51848a0 | 25 | "<?xml version=\"1.0\" standalone='no' >\r\n" |
wvd_vegt | 0:091ca51848a0 | 26 | "<!-- Our to do list data -->\r\n" |
wvd_vegt | 0:091ca51848a0 | 27 | "<ToDo>\r\n" |
wvd_vegt | 0:091ca51848a0 | 28 | "<!-- Do I need a secure PDA? -->\r\n" |
wvd_vegt | 0:091ca51848a0 | 29 | "<Item priority=\"1\" distance='close'> Go to the <bold>Toy store!</bold></Item>\r\n" |
wvd_vegt | 0:091ca51848a0 | 30 | "<Item priority=\"2\" distance='none'> Do bills </Item>\r\n" |
wvd_vegt | 0:091ca51848a0 | 31 | "<Item priority=\"2\" distance='far & back'> Look for Evil Dinosaurs! </Item>\r\n" |
wvd_vegt | 0:091ca51848a0 | 32 | "</ToDo>\r\n"; |
wvd_vegt | 0:091ca51848a0 | 33 | |
wvd_vegt | 0:091ca51848a0 | 34 | // Load Xml into a XmlDocument. |
wvd_vegt | 0:091ca51848a0 | 35 | TiXmlDocument doc("/local/demotest.xml"); |
wvd_vegt | 0:091ca51848a0 | 36 | |
wvd_vegt | 0:091ca51848a0 | 37 | // Parse Xml. |
wvd_vegt | 0:091ca51848a0 | 38 | doc.Parse(demoStart); |
wvd_vegt | 0:091ca51848a0 | 39 | |
wvd_vegt | 0:091ca51848a0 | 40 | // Get the tagname of the Root Element (ToDo). |
wvd_vegt | 0:091ca51848a0 | 41 | // Note: doc.RootElement()->Value().c_str() is not compatible with printf! E153 |
wvd_vegt | 0:091ca51848a0 | 42 | string tag = doc.RootElement()->Value(); |
wvd_vegt | 0:091ca51848a0 | 43 | usb.printf("RootElement = <%s>\r\n\r\n", tag.c_str()); |
wvd_vegt | 0:091ca51848a0 | 44 | |
wvd_vegt | 0:091ca51848a0 | 45 | // Iterate Elements with for loop. |
wvd_vegt | 0:091ca51848a0 | 46 | usb.printf("Enumerating Item Child Tags:\r\n"); |
wvd_vegt | 0:091ca51848a0 | 47 | for (TiXmlNode* child = doc.RootElement()->FirstChild(); child; child = child->NextSibling() ) { |
wvd_vegt | 0:091ca51848a0 | 48 | if (child->Type()==TiXmlNode::TINYXML_ELEMENT) { |
wvd_vegt | 0:091ca51848a0 | 49 | tag = child->Value(); |
wvd_vegt | 0:091ca51848a0 | 50 | usb.printf(" Child = <%s>\r\n", tag.c_str()); |
wvd_vegt | 0:091ca51848a0 | 51 | usb.printf(" Text = '%s'\r\n\r\n", child->ToElement()->GetText()); |
wvd_vegt | 0:091ca51848a0 | 52 | } |
wvd_vegt | 0:091ca51848a0 | 53 | } |
wvd_vegt | 0:091ca51848a0 | 54 | |
wvd_vegt | 0:091ca51848a0 | 55 | //Walk Elements by FirstChildElement/NextSiblingElement. |
wvd_vegt | 0:091ca51848a0 | 56 | usb.printf("Walking Item Child Tags:\r\n"); |
wvd_vegt | 0:091ca51848a0 | 57 | TiXmlElement* child = doc.RootElement()->FirstChildElement("Item"); |
wvd_vegt | 0:091ca51848a0 | 58 | |
wvd_vegt | 0:091ca51848a0 | 59 | do { |
wvd_vegt | 0:091ca51848a0 | 60 | tag = child->Value(); |
wvd_vegt | 0:091ca51848a0 | 61 | usb.printf(" Child = <%s>\r\n", tag.c_str()); |
wvd_vegt | 0:091ca51848a0 | 62 | usb.printf(" Text = '%s'\r\n\r\n", child->ToElement()->GetText()); |
wvd_vegt | 0:091ca51848a0 | 63 | |
wvd_vegt | 0:091ca51848a0 | 64 | child = child->NextSiblingElement("Item"); |
wvd_vegt | 0:091ca51848a0 | 65 | } while (child); |
wvd_vegt | 0:091ca51848a0 | 66 | |
wvd_vegt | 0:091ca51848a0 | 67 | //Save to a file on the /local/ filesystem on Usb. |
wvd_vegt | 0:091ca51848a0 | 68 | usb.printf("Saving with filename:\r\n"); |
wvd_vegt | 0:091ca51848a0 | 69 | doc.SaveFile("/local/out_1.xml"); |
wvd_vegt | 0:091ca51848a0 | 70 | |
wvd_vegt | 0:091ca51848a0 | 71 | //Save to a file on the /local/ filesystem on Usb. |
wvd_vegt | 0:091ca51848a0 | 72 | usb.printf("Saving with FILE:\r\n"); |
wvd_vegt | 0:091ca51848a0 | 73 | FILE *fp = fopen("/local/out_2.xml", "w"); |
wvd_vegt | 0:091ca51848a0 | 74 | doc.SaveFile(fp); |
wvd_vegt | 0:091ca51848a0 | 75 | fclose(fp); |
wvd_vegt | 0:091ca51848a0 | 76 | |
wvd_vegt | 0:091ca51848a0 | 77 | if ( doc.Error() ) { |
wvd_vegt | 0:091ca51848a0 | 78 | usb.printf( "Error in %s: %s\n", doc.Value(), doc.ErrorDesc() ); |
wvd_vegt | 0:091ca51848a0 | 79 | |
wvd_vegt | 0:091ca51848a0 | 80 | exit( 1 ); |
wvd_vegt | 0:091ca51848a0 | 81 | } |
wvd_vegt | 0:091ca51848a0 | 82 | |
wvd_vegt | 0:091ca51848a0 | 83 | //Print the Parsed Xml. |
wvd_vegt | 0:091ca51848a0 | 84 | usb.printf("Printing XML:\r\n"); |
wvd_vegt | 0:091ca51848a0 | 85 | TiXmlPrinter printer; |
wvd_vegt | 0:091ca51848a0 | 86 | printer.SetLineBreak("\r\n"); //Default is "\n". |
wvd_vegt | 0:091ca51848a0 | 87 | doc.Accept(&printer); |
wvd_vegt | 0:091ca51848a0 | 88 | |
wvd_vegt | 0:091ca51848a0 | 89 | usb.printf("%s\r\n", printer.CStr()); |
wvd_vegt | 0:091ca51848a0 | 90 | |
wvd_vegt | 0:091ca51848a0 | 91 | while (1) { |
wvd_vegt | 0:091ca51848a0 | 92 | //Wait... |
wvd_vegt | 0:091ca51848a0 | 93 | } |
wvd_vegt | 0:091ca51848a0 | 94 | } |