expat GetAttribute help cpp

Discussion in 'XML' started by David, Dec 14, 2003.

  1. David

    David Guest

    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;
    }
     
    David, Dec 14, 2003
    #1
    1. Advertising

  2. In article <brif8t$gut$>, David <> wrote:

    % 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.

    --

    Patrick TJ McPhee
    East York Canada
     
    Patrick TJ McPhee, Dec 15, 2003
    #2
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.

Share This Page