Wing
Wing

Reputation: 992

why do I get NULL pointers with tinyXML2 in C++?

I'm new in the XML-parsing buisness. So sorry for silly questions.

I would like to navigate my XML:

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
   <book id="bk103">
      <author>Corets, Eva</author>
      <title>Maeve Ascendant</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-11-17</publish_date>
      <description>After the collapse of a nanotechnology 
      society in England, the young survivors lay the 
      foundation for a new society.</description>
   </book>
   <book id="bk104">
      <author>Corets, Eva</author>
      <title>Oberon's Legacy</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2001-03-10</publish_date>
      <description>In post-apocalypse England, the mysterious 
      agent known only as Oberon helps to create a new life 
      for the inhabitants of London. Sequel to Maeve 
      Ascendant.</description>
   </book>
   <book id="bk105">
      <author>Corets, Eva</author>
      <title>The Sundered Grail</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2001-09-10</publish_date>
      <description>The two daughters of Maeve, half-sisters, 
      battle one another for control of England. Sequel to 
      Oberon's Legacy.</description>
   </book>
   <book id="bk106">
      <author>Randall, Cynthia</author>
      <title>Lover Birds</title>
      <genre>Romance</genre>
      <price>4.95</price>
      <publish_date>2000-09-02</publish_date>
      <description>When Carla meets Paul at an ornithology 
      conference, tempers fly as feathers get ruffled.</description>
   </book>
   <book id="bk107">
      <author>Thurman, Paula</author>
      <title>Splish Splash</title>
      <genre>Romance</genre>
      <price>4.95</price>
      <publish_date>2000-11-02</publish_date>
      <description>A deep sea diver finds true love twenty 
      thousand leagues beneath the sea.</description>
   </book>
   <book id="bk108">
      <author>Knorr, Stefan</author>
      <title>Creepy Crawlies</title>
      <genre>Horror</genre>
      <price>4.95</price>
      <publish_date>2000-12-06</publish_date>
      <description>An anthology of horror stories about roaches,
      centipedes, scorpions  and other insects.</description>
   </book>
</catalog>

whereas the code i am trying to run (following an internet tutorial) is:

tinyxml2::XMLDocument mappedxml1;
XMLError eResult = mappedxml1.LoadFile(filename1);
if(eResult == XML_SUCCESS){
        printf("XMLERROR is %d\nXML loading successfull.\n",eResult);
    }
    else{
        printf("XMLERROR is %d\nXML loading unsuccessfull.\n",eResult);
    }
XMLNode * pRoot1 = mappedxml1.FirstChild();
    if(pRoot1 == NULL){printf("ERROR: NO ROOT\n");}
    else{printf("Good pointer\n");}
XMLElement * pbook1 = pRoot1->FirstChildElement("book id");
    if (pbook1 == NULL){printf("ERROR PARSING ELEMENT\n");}
    else{printf("GOT IT\n");}

While pRoot1 is good to go, the value of pbook1 is always NULL. I would expect it to point to bk101

any help or suggestions? thank you in advance

Upvotes: 1

Views: 494

Answers (1)

Lightness Races in Orbit
Lightness Races in Orbit

Reputation: 385284

You're trying to find an element named book id. There is no such element.

There are, however, elements with the name book!
(And each one has an attribute named id.)

You'll also need the parser to skip your XML declaration, which is currently being caught by the FirstChild call (so *pRoot1 isn't what you think it is!). You could try FirstChildElement("catalog") there instead.

As an aside, I suggest reviewing your error handling procedures; at the moment, if pRoot1 is a null pointer then you write a message to the console, then happily continue on to attempt dereferencing that null pointer.

Upvotes: 6

Related Questions