M
MBR
Help!
I am using xerces with C++ and want to read the following simple file:
<?xml version="1.0"?>
<pets>
<pet>
<name>Tilly</name>
<age>14</age>
<type>cat</type>
<color>silver</color>
<pflege morgens="Essen geben" abends="Schlaflied"/>
</pet>
<pet>
<name>Amanda</name>
<age>10</age>
<type>dog</type>
<color>brown</color>
<pflege morgens="Trinken geben" abends="Schlachten"/>
</pet>
</pets>
I can read the attributes, but not the value of the elements? What is
wrong? The method "value = testnode.getNodeValue().transcode();" is not
working.
Thanks,
Matthias
#include <xercesc/dom/deprecated/DOMParser.hpp>
#include <xercesc/dom/deprecated/DOM_DOMException.hpp> // Alles
notwendig einzubinden??????
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/dom/DOMNode.hpp>
#include <locale.h>
#include <iostream>
using namespace std;
XERCES_CPP_NAMESPACE_USE
int main(int argc, char* argv[])
{
// setzen des aktuellen Gebietsschemas...
setlocale(LC_ALL,NULL);
// ...ausgenommen sind Ziffern
setlocale(LC_NUMERIC,"C");
try
{
XMLPlatformUtils::Initialize();
}
catch (const XMLException& c_roToCatch)
{
cerr << "Fehler bei der Initialisierung: " <<
c_roToCatch.getMessage() << endl;
exit(1);
};
DOMParser oParser;
try // Exception
funktioniert nicht, wenn die Datei z.B. nicht existiert!
{
oParser.parse("test.xml");
}
catch(const XMLException& c_roToCatch)
{
cerr << "Fehler beim Parsen: " << c_roToCatch.getMessage() << endl;
exit(1);
}
catch(const DOM_DOMException&)
{
cerr << "DOM Fehler beim Parsen" << endl;
exit(1);
}
catch(...)
{
cerr << "unerwarteter Fehler beim Parsen. " << endl;
exit(1);
}
DOM_Document oDoc = oParser.getDocument();
if (oDoc != 0) // ab hier kann mit dem
Dokument gearbeitet werden
{
DOM_Element oRoot = oDoc.getDocumentElement(); // zeigt auf
pets
if (oRoot != 0)
{
string name = oRoot.getNodeName().transcode();
string value = "";
cout << "Name des Root-Elements: " << name << endl;
DOM_Node oNode = oRoot.getFirstChild();
while (oNode != 0) //
Iterator ueber die verschiedenen pet
{
if (oNode.getNodeType() == DOM_Node::ELEMENT_NODE)
{
DOM_Element oDomEl = (DOM_Element&) oNode;
name = oDomEl.getNodeName().transcode();
cout << " Node Name: " << name << endl;
if(oDomEl.getNodeName().equals(DOMString("pet"))) // Iterator
{
DOM_Node testnode = oDomEl.getFirstChild(); //
DOMNodes sind dann name, age, type
while (testnode !=0)
{
name = testnode.getNodeName().transcode();
if (testnode.getNodeType() == DOM_Node::ELEMENT_NODE)
{
DOM_Element oNodeEl2 = (DOM_Element&) testnode;
if (!name.compare("pflege"))
{
DOMString dom_value =
oNodeEl2.getAttribute(DOMString("morgens"));
if (dom_value.length() > 0)
{
value = dom_value.transcode();
cout << " Pflege morgens: " << value;
}
dom_value =
oNodeEl2.getAttribute(DOMString("abends"));
if (dom_value.length() > 0)
{
value = dom_value.transcode();
cout << ", Pflege abends: " << value;
}
}
else // case nodename <> "Pflege"
{
cout << " Node Name: " << name;
DOMString dom_value = oNodeEl2.getNodeValue();
value = dom_value.transcode();
value = testnode.getNodeValue().transcode();
cout << ", Node Value: " << value;
}
cout << endl;
}
testnode = testnode.getNextSibling();
}
}
};
oNode = oNode.getNextSibling();
};
};
};
cout << "Ende, weiter mit return" << endl;
// getchar();
return 0;
}
I am using xerces with C++ and want to read the following simple file:
<?xml version="1.0"?>
<pets>
<pet>
<name>Tilly</name>
<age>14</age>
<type>cat</type>
<color>silver</color>
<pflege morgens="Essen geben" abends="Schlaflied"/>
</pet>
<pet>
<name>Amanda</name>
<age>10</age>
<type>dog</type>
<color>brown</color>
<pflege morgens="Trinken geben" abends="Schlachten"/>
</pet>
</pets>
I can read the attributes, but not the value of the elements? What is
wrong? The method "value = testnode.getNodeValue().transcode();" is not
working.
Thanks,
Matthias
#include <xercesc/dom/deprecated/DOMParser.hpp>
#include <xercesc/dom/deprecated/DOM_DOMException.hpp> // Alles
notwendig einzubinden??????
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/dom/DOMNode.hpp>
#include <locale.h>
#include <iostream>
using namespace std;
XERCES_CPP_NAMESPACE_USE
int main(int argc, char* argv[])
{
// setzen des aktuellen Gebietsschemas...
setlocale(LC_ALL,NULL);
// ...ausgenommen sind Ziffern
setlocale(LC_NUMERIC,"C");
try
{
XMLPlatformUtils::Initialize();
}
catch (const XMLException& c_roToCatch)
{
cerr << "Fehler bei der Initialisierung: " <<
c_roToCatch.getMessage() << endl;
exit(1);
};
DOMParser oParser;
try // Exception
funktioniert nicht, wenn die Datei z.B. nicht existiert!
{
oParser.parse("test.xml");
}
catch(const XMLException& c_roToCatch)
{
cerr << "Fehler beim Parsen: " << c_roToCatch.getMessage() << endl;
exit(1);
}
catch(const DOM_DOMException&)
{
cerr << "DOM Fehler beim Parsen" << endl;
exit(1);
}
catch(...)
{
cerr << "unerwarteter Fehler beim Parsen. " << endl;
exit(1);
}
DOM_Document oDoc = oParser.getDocument();
if (oDoc != 0) // ab hier kann mit dem
Dokument gearbeitet werden
{
DOM_Element oRoot = oDoc.getDocumentElement(); // zeigt auf
pets
if (oRoot != 0)
{
string name = oRoot.getNodeName().transcode();
string value = "";
cout << "Name des Root-Elements: " << name << endl;
DOM_Node oNode = oRoot.getFirstChild();
while (oNode != 0) //
Iterator ueber die verschiedenen pet
{
if (oNode.getNodeType() == DOM_Node::ELEMENT_NODE)
{
DOM_Element oDomEl = (DOM_Element&) oNode;
name = oDomEl.getNodeName().transcode();
cout << " Node Name: " << name << endl;
if(oDomEl.getNodeName().equals(DOMString("pet"))) // Iterator
{
DOM_Node testnode = oDomEl.getFirstChild(); //
DOMNodes sind dann name, age, type
while (testnode !=0)
{
name = testnode.getNodeName().transcode();
if (testnode.getNodeType() == DOM_Node::ELEMENT_NODE)
{
DOM_Element oNodeEl2 = (DOM_Element&) testnode;
if (!name.compare("pflege"))
{
DOMString dom_value =
oNodeEl2.getAttribute(DOMString("morgens"));
if (dom_value.length() > 0)
{
value = dom_value.transcode();
cout << " Pflege morgens: " << value;
}
dom_value =
oNodeEl2.getAttribute(DOMString("abends"));
if (dom_value.length() > 0)
{
value = dom_value.transcode();
cout << ", Pflege abends: " << value;
}
}
else // case nodename <> "Pflege"
{
cout << " Node Name: " << name;
DOMString dom_value = oNodeEl2.getNodeValue();
value = dom_value.transcode();
value = testnode.getNodeValue().transcode();
cout << ", Node Value: " << value;
}
cout << endl;
}
testnode = testnode.getNextSibling();
}
}
};
oNode = oNode.getNextSibling();
};
};
};
cout << "Ende, weiter mit return" << endl;
// getchar();
return 0;
}