hey can someone tell me how i read the text between the <name>blabla</name> ? (xml )
becouse i tried the meshviewer tutorial but that only works if you have only one text to read but i need to read a lot more then that.
a different tutorial would also be nice
thanks in advance
xml basic stuff
According to the documentation, you want the EXN_TEXT element. The following was taken directly from irrXML.h...
The code for parsing this file would look like this:
Code: Select all
<?xml version="1.0"?>
<config>
<!-- This is a config file for the mesh viewer -->
<model file="dwarf.dea" />
<messageText caption="Irrlicht Engine Mesh Viewer">
Welcome to the Mesh Viewer of the "Irrlicht Engine".
</messageText>
</config>
Code: Select all
#include <irrXML.h>
using namespace irr; // irrXML is located in the namespace irr::io
using namespace io;
#include <string> // we use STL strings to store data in this example
void main()
{
// create the reader using one of the factory functions
IrrXMLReader* xml = createIrrXMLReader("config.xml");
// strings for storing the data we want to get out of the file
std::string modelFile;
std::string messageText;
std::string caption;
// parse the file until end reached
while(xml && xml->read())
{
switch(xml->getNodeType())
{
case EXN_TEXT:
// in this xml file, the only text which occurs is the messageText
messageText = xml->getNodeData();
break;
case EXN_ELEMENT:
{
if (!strcmp("model", xml->getNodeName()))
modelFile = xml->getAttributeValue("file");
else
if (!strcmp("messageText", xml->getNodeName()))
caption = xml->getAttributeValue("caption");
}
break;
}
}
// delete the xml parser after usage
delete xml;
}
myes but like i said and also the tutorial said you can only do that if theres only one piece of text you need instead of having more elements with text. if i try the same thing with more text elements, i can only read the last element.
i tried: blabla = xml->getNodeData(name of element);
but doesn't work and i also don't need a case
i tried: blabla = xml->getNodeData(name of element);
but doesn't work and i also don't need a case
You need to keep track of the current Xml Node you are processing.
case io::EXN_ELEMENT you will check which kind of your text's it is
and in case EXN_TEXT you check which node you are processing as well
This is not the most elegant way, but it will get you started
case io::EXN_ELEMENT you will check which kind of your text's it is
Code: Select all
if (!strcmp("nodename1", xml->getNodeName()))
{
trackingNode = 1;
}
else
{
trackingNode = 2;
}
Code: Select all
switch(trackingNode)
{
case 1:
//do something with text
break;
case 2:
//do something else with text
break;
}
hey i just found a shorter way
(this way just makes it easier becouse you don't have to define the xml elements every time)
and don't get me wrong becouse without your help i wouldn't have figured this outIXMLReader* xml = device->getFileSystem()->createXMLReader("config.xml");
while(xml && xml->read())
{
switch(xml->getNodeType())
{
case EXN_ELEMENT:
trackingNode = xml->getNodeName();
break;
case EXN_TEXT:
if (trackingNode == "udriver")//udriver is the xml element
{
driv = xml->getNodeData();
}
break;
}
}
if (xml)
xml->drop();
(this way just makes it easier becouse you don't have to define the xml elements every time)