expat GetAttribute help cpp

David (120)

Usenet Archive
Joined
Dec 14, 2003
Messages
3
Reaction score
0
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;
}
 

Patrick TJ McPhee

Usenet Archive
Joined
Apr 2, 2000
Messages
269
Reaction score
0
% 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

No members online now.

Forum statistics

Threads
548,208
Messages
3,104,799
Members
249,594
Latest member
henrywalsh

Latest Threads

Top