-----Original Message-----
From: ext Alberto Massari [mailto:[EMAIL PROTECTED]
Sent: Wednesday, January 30, 2008 5:10 PM
To: c-dev@xerces.apache.org
Subject: Re: Problems in parsing; values not printed on the screen.
It's hard to say just by looking at this fragment of code. Do you see
the total "number of elements=XX" message? How many elements did the
code find? Does your fragment contain non-ASCII characters that
XMLString::transcode could fail to translate?
Alberto
Kanagal, Rahul (NSN - IN/India - MiniMD) wrote:
Hello,
I am trying to write a decode function(using DOM parser) to decode XML
content in a buffer and print the values of the element names,values
and their attributes.
The code is just a modification of the sample code from apache which
parses XML content from a file. The code works just fine for file
parse, but the modified code for parsing buffer contents is just not
printing the values on the screen. I am a new developer and I am not
able to find out what the problem is.Can somebody please help?
Thanks,
Rahul.
Here is a sample of the code:
//
----------------------------------------------------------------------
-----
// Includes
//
----------------------------------------------------------------------
-----
#include <xercesc/util/PlatformUtils.hpp> #include
<xercesc/parsers/AbstractDOMParser.hpp>
#include <xercesc/dom/DOMImplementation.hpp>
#include <xercesc/dom/DOMImplementationLS.hpp>
#include <xercesc/dom/DOMImplementationRegistry.hpp>
#include <xercesc/dom/DOMBuilder.hpp>
#include <xercesc/dom/DOMException.hpp> #include
<xercesc/dom/DOMDocument.hpp> #include <xercesc/dom/DOMNodeList.hpp>
#include <xercesc/dom/DOMError.hpp> #include
<xercesc/dom/DOMLocator.hpp> #include
<xercesc/dom/DOMNamedNodeMap.hpp> #include <xercesc/dom/DOMAttr.hpp>
#include <xercesc/framework/Wrapper4DOMInputSource.hpp>
#include <xercesc/framework/Wrapper4InputSource.hpp>
#include <xercesc/framework/MemBufInputSource.hpp>
#include "DOMCount.h"
#include <string.h>
#include <stdlib.h>
#include <iostream>
#if defined(XERCES_NEW_IOSTREAMS)
#include <fstream>
#else
#include <fstream.h>
#endif
#include"DOMDecode.hpp"
using namespace std;
//
----------------------------------------------------------------------
-----
// This is a simple program which invokes the DOMParser to build a
DOM // tree for the specified input file. It then walks the tree and
prints out the // elements and their values.
//
----------------------------------------------------------------------
-----
static int decodeChildElements(DOMNode *n) {
DOMNode *child;
int count = 0;
if (n) {
if (n->getNodeType() == DOMNode::ELEMENT_NODE)
{
char *name =
XMLString::transcode(n->getNodeName());
XERCES_STD_QUALIFIER cout <<"Element Name : "<< name
<< XERCES_STD_QUALIFIER endl;
name =
XMLString::transcode(n->getFirstChild()->getNodeValue());
XERCES_STD_QUALIFIER cout <<"Element Value : "<< name
<< XERCES_STD_QUALIFIER endl;
XMLString::release(&name);
if(n->hasAttributes()) {
// get all the attributes of the node
DOMNamedNodeMap *pAttributes = n->getAttributes();
int nSize = pAttributes->getLength();
XERCES_STD_QUALIFIER cout <<"\tAttributes" <<
XERCES_STD_QUALIFIER endl;
XERCES_STD_QUALIFIER cout <<"\t----------" <<
XERCES_STD_QUALIFIER endl;
for(int i=0;i<nSize;++i) {
DOMAttr *pAttributeNode = (DOMAttr*)
pAttributes->item(i);
// get attribute name
char *name =
XMLString::transcode(pAttributeNode->getName());
XERCES_STD_QUALIFIER cout << "\t" << name <<
"=";
XMLString::release(&name);
// get attribute type
name =
XMLString::transcode(pAttributeNode->getValue());
XERCES_STD_QUALIFIER cout << name <<
XERCES_STD_QUALIFIER endl;
XMLString::release(&name);
}
}
++count;
}
for (child = n->getFirstChild(); child != 0;
child=child->getNextSibling())
count += decodeChildElements(child);
}
return count;
}
int decodeXml(const char *buf)
{
static const char* bufId = "XML content";
AbstractDOMParser::ValSchemes valScheme =
AbstractDOMParser::Val_Auto;
bool doNamespaces = false;
bool doSchema = false;
bool schemaFullChecking = false;
bool doList = false;
bool errorOccurred = false;
bool recognizeNEL = false;
char localeStr[64];
memset(localeStr, 0, sizeof localeStr);
// Initialize the XML4C system
try
{
if (strlen(localeStr))
{
XMLPlatformUtils::Initialize(localeStr);
}
else
{
XMLPlatformUtils::Initialize();
}
if (recognizeNEL)
{
XMLPlatformUtils::recognizeNEL(recognizeNEL);
}
}
catch (const XMLException& toCatch)
{
XERCES_STD_QUALIFIER cerr << "Error during initialization!
:\n"
<< StrX(toCatch.getMessage()) << XERCES_STD_QUALIFIER
endl;
return 1;
}
// Instantiate the DOM parser.
static const XMLCh gLS[] = { chLatin_L, chLatin_S, chNull };
DOMImplementation *impl =
DOMImplementationRegistry::getDOMImplementation(gLS);
DOMBuilder *parser =
((DOMImplementationLS*)impl)->createDOMBuilder(DOMImplementationLS::MODE
_SYNCHRONOUS,
0);
parser->setFeature(XMLUni::fgDOMNamespaces, doNamespaces);
parser->setFeature(XMLUni::fgXercesSchema, doSchema);
parser->setFeature(XMLUni::fgXercesSchemaFullChecking,
schemaFullChecking);
if (valScheme == AbstractDOMParser::Val_Auto)
{
parser->setFeature(XMLUni::fgDOMValidateIfSchema, true);
}
else if (valScheme == AbstractDOMParser::Val_Never)
{
parser->setFeature(XMLUni::fgDOMValidation, false);
}
else if (valScheme == AbstractDOMParser::Val_Always)
{
parser->setFeature(XMLUni::fgDOMValidation, true);
}
// enable datatype normalization - default is off
parser->setFeature(XMLUni::fgDOMDatatypeNormalization, true);
// And create our error handler and install it
DOMCountErrorHandler errorHandler;
parser->setErrorHandler(&errorHandler);
bool more = true;
XERCES_STD_QUALIFIER ifstream fin;
//......creating a MemBufInputSource
* MemBufInputSource* memBufIS = new MemBufInputSource((const
XMLByte*)buf, strlen(buf), bufId, false);*
* Wrapper4InputSource *wrapper=new
Wrapper4InputSource(memBufIS,false);*
while (more)
{
more = false;
//reset error count first
errorHandler.resetErrors();
XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc = 0;
try
{
// reset document pool
parser->resetDocumentPool();
* parser->parse(*wrapper);*
}
catch (const XMLException& toCatch)
{
XERCES_STD_QUALIFIER cerr << "\nError during parsing: '"
<< buf << "'\n"
<< "Exception message is: \n"
<< StrX(toCatch.getMessage()) << "\n" <<
XERCES_STD_QUALIFIER endl;
errorOccurred = true;
continue;
}
catch (const DOMException& toCatch)
{
const unsigned int maxChars = 2047;
XMLCh errText[maxChars + 1];
XERCES_STD_QUALIFIER cerr << "\nDOM Error during parsing:
'" << buf<< "'\n"
<< "DOMException code is: " << toCatch.code <<
XERCES_STD_QUALIFIER endl;
if (DOMImplementation::loadDOMExceptionMsg(toCatch.code,
errText, maxChars))
XERCES_STD_QUALIFIER cerr << "Message is: " <<
StrX(errText) << XERCES_STD_QUALIFIER endl;
errorOccurred = true;
continue;
}
catch (...)
{
XERCES_STD_QUALIFIER cerr << "\nUnexpected exception
during parsing: '" << buf << "'\n";
errorOccurred = true;
continue;
}
if (errorHandler.getSawErrors())
{
XERCES_STD_QUALIFIER cout << "\nErrors occurred, no output
available\n" << XERCES_STD_QUALIFIER endl;
errorOccurred = true;
}
else
{
if (doc) {
int elementCount =
decodeChildElements((DOMNode*)doc->getDocumentElement());
cout<<"total number of
elements="<<elementCount<<endl;
}
}
}
//
// Delete the parser itself. Must be done prior to calling
Terminate, below.
//
parser->release();
// And call the termination method
XMLPlatformUtils::Terminate();
if (doList)
fin.close();
if (errorOccurred)
return 4;
else
return 0;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]