1

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

1
  • 2
    Even when your program failed to load XML you are continuing the process. Commented May 6, 2016 at 12:02

1 Answer 1

6

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.

Sign up to request clarification or add additional context in comments.

7 Comments

you are abviously right. I agree on the error management thing: I just copied parts of the whole code. Nonetheless, how do I get pbook1 to point to the first book?
@Wing: By writing book instead of book id.
I've tried: XMLElement * pbook1 = pRoot1->FirstChildElement("book id"); XMLElement * pbook1 = pRoot1->FirstChildElement("book"); XMLElement * pbook1 = pRoot1->FirstChildElement(); I always get NULL
@Wing: You probably need to skip over the XML declaration too. Examine the root node to see what it actually is. Which documentation are you using?
@Wing: Yeah so notice that their example has no XML declaration. If you examine *pRoot1 you'll probably see that it's not called catalog. Try using FirstChildElement (rather than FirstChild) for the root node too.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.