expat GetAttribute help cpp

D

David

Hi,
I'm trying to parse an xml file and am a bit confused. I have created my
class XmlParser.


Also I have 3 other questions.
1-How to the GetAttribute to search for the value of a specific pattern ?
I want to get the value of the Count tag.

2- My file does not contain the standalone header ? How can I deal with
that.
3- In terms of memory handling is it righ to use the ParserFile method or
should i use another one ?


Too many questions I know,

thanks fo any help,


david


<?xml version="1.0"?>
<!DOCTYPE eSearchResult PUBLIC "-//NLM//DTD eSearchResult, 11 May 2002//EN"
"http://www.ncbi.nlm.nih.gov/entrez/query/DTD/eSearch_020511.dtd">
<eSearchResult>
<Count>338</Count>
<RetMax>1</RetMax>
<RetStart>0</RetStart>
<QueryKey>1</QueryKey>
<WebEnv>0qq2WLXpVUiIFEtvIrTlducz5uJT8c0vroAyBVMqIoqZjrVInjNh</WebEnv>
<IdList>
<Id>14645367</Id>
</IdList>
<TranslationSet>
<Translation>
<From>snorna%5BAll+Fields%5D</From>
<To>(%22rna,+small+nucleolar%22%5BMeSH+Terms%5D+OR+snorna%5BText+Word
5D)</To>
</Translation>
</TranslationSet>
<TranslationStack>
<TermSet>
<Term>"rna, small nucleolar"[MeSH Terms]</Term>
<Field>MeSH Terms</Field>
<Count>144</Count>
<Explode>Y</Explode>
</TermSet>
<TermSet>
<Term>snorna[Text Word]</Term>
<Field>Text Word</Field>
<Count>284</Count>
<Explode>Y</Explode>
</TermSet>
<OP>OR</OP>
</TranslationStack>
</eSearchResult>

-------------------------
#include <iostream>
#include "XmlParser.h"


using namespace std;

testclass.cpp
int main (int argc, char **argv)
{
FILE* xmlFile;
XmlParser parser;

xmlFile = fopen(argv[1], "r");


if (!parser.parseFile(xmlFile)) {
fprintf(stderr,
"%s at line %d\n",
XML_ErrorString(parser.XML_GetErrorCode()),
parser.XML_GetCurrentLineNumber());
return 1;
}


char *test = "count";
parser.getAttribute(test);

while (!feof (xmlFile))
XML_ParserFree(parser);
return 0;
}


---------------------------------------------
XmlParser.cpp
void XmlParser::startElement(const XML_Char* name, const XML_Char** atts)
{

cout <<"Attribut:"<<name <<" Depth:"<< mDepth <<endl;
mDepth++;
}


void XmlParser::endElement(const XML_Char*)
{
mDepth--;
}


void XmlParser::charData(const XML_Char *s, int len)
{
const int leadingSpace = skipWhiteSpace(s);
if (len==0 || len==leadingSpace)
return; // called with whitespace between elements


cout <<" Value:";
fwrite(s, len, 1, stdout);
cout<<" Depth:"<< (mDepth-1) <<endl;

}


const XML_Char* XmlParser::getAttribute(const XML_Char *matchingName)
{

cout << "Match:" << matchingName << endl;
}
 
P

Patrick TJ McPhee

% 1-How to the GetAttribute to search for the value of a specific pattern ?
% I want to get the value of the Count tag.

Count is an element, not an attribute. in fact, your example contains
no attributes, only elements. If you're using expat, the parser doesn't
save anything for you -- you're expected to build whatever data structures
you need in your startElement method. You need to either save anything
you want to be able to query as the parse goes on, (i.e., stick the
element name and character value in a list), or you want to store the
names that you're interested in before the parse, then set a flag
when the appropriate elements come up, and print the character data
when the flag is set.

% 2- My file does not contain the standalone header ? How can I deal with
% that.

Most files don't have the standalone header. The example file doesn't
need anything from the DTD (unless there are default attribute values),
so you could simply not worry about it, but I think expat can read
external DTDs, so you could just let it read the DTD.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,817
Latest member
DicWeils

Latest Threads

Top