Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations strongm on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

extracting xml data

Status
Not open for further replies.

daula

Programmer
May 29, 2006
38
US
Hello everyone;
I'm trying to extract data from xml files.
at the moment I have two set of xml files that are two and three levels deep respectively.

1st:
-state
-date_range

2nd:
-date
-dollar_range
-gender

In the first instance, I would like to grab all the date_range (value and count) for every state:
E.g.
AK,86,00-06,26,07-12,26,13-24,34
AL,....

And the in the second instance, get the get the gender for every dollar_range, in every date.
E.g.
200602,3122,000-005,305,M,57 F,220
200601,....

I'm hoping to extract and load all related value/count to a vector of structure. For instance, in the output example 2;
I would have a vector to hold a dollar_range (index) and all gender value/count for that particular range (index).
then, another vector with a date index and all the dollar_ranges for that particular date.

Right now I'm just experimenting, so, any better design is highly apppreciate... as well as any other help.
Please, excuse my spaghetti code.

Thanks in advance

daula

Code:
[c++]
#include <libxml/xmlreader.h>
#include <iostream>
#include <fstream>
#include <exception>
#include <vector>
#include <algorithm>
#include <functional>
#include <map>
#include "common.h"

using namespace std;

/*struct associate
{
    string value;
    unsigned int count;

    associate(string v, unsigned int c) : value(v), count(c){};
    associate() : value(""), count(0){};
};
*/
struct fields
{
    string index;
    string sValue;
    unsigned int sCount;
} data;

struct content_1
{
    std::vector <struct fields> vLevelTwo;
} two_d;

struct content_2
{
    std::vector <struct fields> vLevelTwo;
    std::vector <struct fields> vLevelThree;
} three_d;

void populate_three_d ( map <string, struct content_2> & mm );
void populate_two_d ( map <string, struct content_1> & mm );
const vector<string> get_data ( const string & filename );

int main (int argc, char **argv)
{
    int RetVal (0);

    try
    {
        string filename(argv[1]);
            fstream file(filename.c_str());

        if(!file.is_open())
        {
            RetVal = -1;
            string error ("Failed to open... " + filename);
            cerr << error <<endl;
        }

        else
        {
            int pass = 1;
            vector<string> mVec = get_data(filename);
            int depth (mVec.size());

            file.seekg (0, ios::beg);
            string str, val, cnt, prev_par;

            string temp  ("=");
            string temp2 (">");
            string endian("</dps:tally_output>");
            string value ("<dps:value>");
            string count ("<dps:count>");

            map<string, struct content_1> cMap;
            map<string, struct content_2> cMap2;
            three_d.vLevelThree.clear();
            three_d.vLevelTwo.clear();
            two_d.vLevelTwo.clear();

            while(!file.eof())
            {
                getline(file, str);

                if ( pass > 6 )
                {
                    if (str.rfind(temp) != string::npos  or trim(str) == endian)
                    {
                        string::size_type beg = (str.rfind(temp) + 2);
                        string::size_type end = (str.find_last_of(temp2) - 1);
                        string cur_str = (str.substr(beg, end-beg));

                        if( depth == 2 )
                        {
                            if(cur_str == mVec[1]) { two_d.vLevelTwo.push_back(data); }
                            if(cur_str == mVec[0] or trim(str) == endian)
                            {
                                //associate assoc(data.sValue,data.sCount);
                                cMap[data.sValue]=two_d;
                            }
                        }
                        if( depth ==3 )
                        {
                            if(cur_str == mVec[2]) { three_d.vLevelThree.push_back(data); }
                            if(cur_str == mVec[1])
                            {
                                three_d.vLevelTwo.push_back(data);
                                if(!three_d.vLevelThree.empty()) three_d.vLevelThree.erase (three_d.vLevelThree.end()-1);
                            }
                            if( cur_str == mVec[0] or trim(str) == endian )
                            {
                                //associate assoc(data.sValue,data.sCount);
                                cMap2[data.sValue]=three_d;
                            }
                        }
                    }
                }
                if(str.find(value)!= string::npos and pass > 7)
                {
                    string str2(str); str2=trim2(str2);
                    string::size_type i =  str2.find_first_of(">") + 1;
                    string::size_type j =  str2.find_last_of("</") - 1;
                    val = str2.substr(i,(j-i));
                    data.sValue = trim(val);
                    cnt="";
                }

                if(str.find(count)!= string::npos and pass > 7)
                {
                    string str2(str); str2=trim2(str2);
                            string::size_type k =  str2.find_first_of(">") + 1;
                    string::size_type l =  str2.find_last_of("</") - 1;

                    cnt = str2.substr(k,(l-k));
                    data.sCount = atoi(cnt.c_str());
                    val = "";
                }
                pass++;
            }

            if(depth==2) populate_two_d (cMap);
            if(depth==3) populate_three_d (cMap2);

            file.close();
        }
    }
    catch (exception& e){ RetVal=-2; cout << "Error: " << e.what() << endl; }

    return RetVal;
}

void populate_two_d ( map <string, struct content_1> & mm )
{
   map <string, struct content_1>::iterator it = mm.begin();
   vector<struct fields>::iterator vec;

   for ( ; it != mm.end(); it++)
   {
        cout <<(*it).first<<endl;
       // for(vec=(*it).second.vLevelTwo.begin(); vec != (*it).second.vLevelTwo.end(); vec++)
       //      cout <<(*vec).sValue<<","<< (*vec).sCount<<endl;
   }
}

void populate_three_d ( map <string, struct content_2> & mm )
{
   map <string, struct content_2>::iterator it = mm.begin();
   vector<struct fields>::iterator vec;
   vector<struct fields>::iterator vec2;

   for ( ; it != mm.end(); it++)
   {
        cout  <<(*it).first <<endl;
        for(vec=(*it).second.vLevelThree.begin(); vec != (*it).second.vLevelThree.end(); vec++)
        {
          ;;// cout<<(*vec).sValue <<","<<(*vec).sValue<<endl;
            //for(vec2=(*it).second.vLevelThree.begin(); vec2 != (*it).second.vLevelThree.end(); vec2++)
                //cout  <<(*it).first<<","<<(*vec1).sValue<<","<< (*vec1).sCount <<","<<(*vec2).sValue<<","<< (*vec2).sCount<<endl;
        }
   }
}

const vector<string> get_data ( const string & filename )
{
    vector<string> vec, data;
    data.clear();

    string buf;
    string temp("=");
    string temp2(">");

    fstream file(filename.c_str(), ios::in);
    if(file.is_open())
    {
        int i = 0;
        while(!file.eof() and i < 12 )
        {
            getline(file, buf);
            if ( i > 4 )
            {
               vec.push_back(trim(buf));
            }
            i++;
        }
        file.close();
    }
    for (vector<string>::iterator it=vec.begin(); it != vec.end() ; it++ )
    {
        string::size_type beg = 0, end = 0;
        string str (*it);
        if (str.rfind(temp) != string::npos )
        {
            beg = (str.rfind(temp) + 2);
            end = (str.find_last_of(temp2) - 1);
            data.push_back(str.substr(beg, end-beg));
        }
        else
            break;
    }
    return data;
}

[xml sample]
<?xml version="1.0" encoding="utf-8" ?>
<dps:services xmlns:dps="uri">
<dps:output>

<dps:tally dps:name="test_1">
  <dps:tally dps:name="date">
    <dps:tally dps:name="currdollar">
      <dps:tally dps:name="Gender">
        <dps:value>U</dps:value>
        <dps:count>4</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>M</dps:value>
        <dps:count>57</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>I</dps:value>
        <dps:count>5</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>F</dps:value>
        <dps:count>220</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>C</dps:value>
        <dps:count>1</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>A</dps:value>
        <dps:count>18</dps:count>
      </dps:tally>
      <dps:value>000-005</dps:value>
      <dps:count>305</dps:count>
    </dps:tally>
    <dps:tally dps:name="currdollar">
      <dps:tally dps:name="Gender">
        <dps:value>U</dps:value>
        <dps:count>18</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>M</dps:value>
        <dps:count>82</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>I</dps:value>
        <dps:count>14</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>F</dps:value>
        <dps:count>330</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>C</dps:value>
        <dps:count>1</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>A</dps:value>
        <dps:count>33</dps:count>
      </dps:tally>                                                                                                                                                 
      <dps:value>005-010</dps:value>
      <dps:count>478</dps:count>
    </dps:tally>
    <dps:tally dps:name="currdollar">
      <dps:tally dps:name="Gender">
        <dps:value>U</dps:value>
        <dps:count>20</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>M</dps:value>
        <dps:count>109</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>I</dps:value>
        <dps:count>25</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>F</dps:value>
        <dps:count>490</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>C</dps:value>
        <dps:count>6</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>B</dps:value>
        <dps:count>1</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>A</dps:value>
        <dps:count>56</dps:count>
      </dps:tally>
      <dps:value>010-015</dps:value>
      <dps:count>707</dps:count>
    </dps:tally>
    <dps:tally dps:name="currdollar">
      <dps:tally dps:name="Gender">
        <dps:value>U</dps:value>
        <dps:count>8</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>M</dps:value>
        <dps:count>34</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>I</dps:value>
        <dps:count>3</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>F</dps:value>
        <dps:count>160</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>C</dps:value>
        <dps:count>1</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>A</dps:value>                                                                                                                                      
        <dps:count>13</dps:count>
      </dps:tally>
      <dps:value>015-020</dps:value>
      <dps:count>219</dps:count>
    </dps:tally>
    <dps:tally dps:name="currdollar">
      <dps:tally dps:name="Gender">
        <dps:value>U</dps:value>
        <dps:count>30</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>M</dps:value>
        <dps:count>131</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>I</dps:value>
        <dps:count>17</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>F</dps:value>
        <dps:count>683</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>C</dps:value>
        <dps:count>6</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>A</dps:value>
        <dps:count>74</dps:count>
      </dps:tally>
      <dps:value>020-025</dps:value>
      <dps:count>941</dps:count>
    </dps:tally>
    <dps:tally dps:name="currdollar">
      <dps:tally dps:name="Gender">
        <dps:value>U</dps:value>
        <dps:count>12</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>M</dps:value>
        <dps:count>84</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>I</dps:value>
        <dps:count>5</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>F</dps:value>
        <dps:count>251</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>C</dps:value>
        <dps:count>4</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>B</dps:value>
        <dps:count>1</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">                                                                                                                                                              
        <dps:value>A</dps:value>
        <dps:count>20</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>7</dps:value>
        <dps:count>1</dps:count>
      </dps:tally>
      <dps:value>025-050</dps:value>
      <dps:count>378</dps:count>
    </dps:tally>
    <dps:tally dps:name="currdollar">
      <dps:tally dps:name="Gender">
        <dps:value>U</dps:value>
        <dps:count>2</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>M</dps:value>
        <dps:count>18</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>I</dps:value>
        <dps:count>1</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>F</dps:value>
        <dps:count>59</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>A</dps:value>
        <dps:count>9</dps:count>
      </dps:tally>
      <dps:value>050-075</dps:value>
      <dps:count>89</dps:count>
    </dps:tally>
    <dps:tally dps:name="currdollar">
      <dps:tally dps:name="Gender">
        <dps:value>F</dps:value>
        <dps:count>5</dps:count>
      </dps:tally>
      <dps:value>075-100</dps:value>
      <dps:count>5</dps:count>
    </dps:tally>
    <dps:value>200602</dps:value>
    <dps:count>3122</dps:count>
  </dps:tally>
  <dps:tally dps:name="date">
    <dps:tally dps:name="currdollar">
      <dps:tally dps:name="Gender">
        <dps:value>U</dps:value>
        <dps:count>6</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>M</dps:value>
        <dps:count>37</dps:count>
      </dps:tally>
      <dps:tally dps:name="Gender">
        <dps:value>I</dps:value>
        <dps:count>4</dps:count>
      </dps:tally>
                                                                                                                                                 .
      .
      .
  </dps:tally>
</dps:tally>

</dps:output>
</dps:services>
 
Test for number of command line arguments/valid arguments in main().

You seem to be reading the XML file twice. Once in get_data() and again in main(). Since get_data() returns a vector with the contents of the file, just use that to do your parsing.

If you aren't writing to the file, use ifstream.

Also, either open the file in main() and pass the ifstream& reference to get_data() or just pass the filename to get_data() and let it worry about opening/closing the file.


Code:
if (str.rfind(temp) != string::npos  or trim(str) == endian)
if(str.find(value)!= string::npos and pass > 7)
Unless you've done a
Code:
#define  or  ||
#define  and  &&
somewhere, these lines won't compile. Use || for OR and && for AND.


Change: if( depth ==3 ) to else if( depth ==3 )


atoi() is unreliable.
The return value is 0 (for atoi and _atoi64), 0L (for atol), or 0.0 (for atof) if the input cannot be converted to a value of that type. The return value is undefined in case of overflow.
Use this:
Code:
stringstream str;
str << cnt;
data.sCount = str.str().c_str();
instead of this:
Code:
data.sCount = atoi(cnt.c_str());


In get_data(), delete this line since you just declared 'data' above, it's already empty:
Code:
data.clear();
 
I appreciate your help guys.
I can't use libxm++ right now. I requested its install but the admin guys wont do it. So, I've no choice but to use what I got.
I can't use
That been said, I still need your help guys...

thanks again.

daula


Code:
#include <iostream>
#include <sstream>
#include <fstream>
#include <exception>
#include <vector>
#include <algorithm>
#include <functional>
#include <map>
#include "common.h"

using namespace std;

struct fields
{
    string sValue;
    int sCount;
} data;

struct content_1
{
    std::vector <struct fields> vLevelTwo;
} two_d;

struct content_2
{
    std::vector <struct fields> vLevelTwo;
    std::vector <struct fields> vLevelThree;
} three_d;

void populate_three_d ( map <string, struct content_2> & mm );
void populate_two_d ( map <string, struct content_1> & mm );
const vector<string> get_data ( const string & filename );

int main (int argc, char **argv)
{
    int RetVal (0);

    try
    {
        if(argc < 2)
        {
            /*usage()*/
            exit(1);
        }
        else
        {
            string filename(argv[1]);
            fstream file(filename.c_str());

            if(!file.is_open())
            {
                RetVal = -1;
                string error("Error: Failed to open... " + filename);
                throw error;
            }

            int pass = 1;
            string buff, curr_val, prev_val(""), curr_cnt, prev_cnt("");

            string temp  ("=");
            string temp2 (">");
            string endian("</dps:tally_output>");
            string value ("<dps:value>");
            string count ("<dps:count>");
            string prev_attr(""), curr_attr("");
            map<string, struct content_1> cMap;
            map<string, struct content_2> cMap2;
            three_d.vLevelThree.clear();
            three_d.vLevelTwo.clear();
            two_d.vLevelTwo.clear();

            vector<string> mVec = get_data(filename);
            int depth (mVec.size());

            vector<string> tempVec;
            for (vector<string>::iterator itr = mVec.begin(), int indx = 0;  indx < 12 ; indx++ )
            {
                 string str (*itr);
                 if (str.rfind(temp) != string::npos )
                 {
                     string::size_type beg = (str.rfind(temp) + 2);
                     string::size_type end = (str.find_last_of(temp2) - 1);
                     tempVec.push_back(str.substr(beg, end-beg));
                     iter++;
                 }
                 else
                     break;
            }

            for (vector<string>::iterator iter = mVec.begin(); iter != mVec.end(); iter++)
            {
                buff = *iter;
                if ( pass > 6 )
                {
                    if (buff.rfind(temp) != string::npos || trim(buff) == endian)
                    {
                        string::size_type beg = (buff.rfind(temp) + 2);
                        string::size_type end = (buff.find_last_of(temp2) - 1);
                        curr_attr = (buff.substr(beg, end-beg));
                    }
                }

                if( depth == 2 && curr_cnt != "")
                {
                  //date_range
                  if(curr_attr == tempVec[1])   { two_d.vLevelTwo.push_back(data); }
                  //state
                  if(curr_attr == tempVec[0] || (trim(buff) == endian)) { cMap[curr_val]=two_d; }
                }
                if( depth ==3 && curr_cnt != "")
                {   //gender
                    if(curr_attr == tempVec[2]) { three_d.vLevelThree.push_back(data); }
                    if(curr_attr == tempVec[1]) { three_d.vLevelTwo.push_back(data); }
                    //cState
                    if(curr_attr == tempVec[0] || (trim(buff) == endian)) { cMap2[curr_val]=three_d; }
                }
                if(buff.find(value)!= string::npos && pass > 7)
                {
                    curr_val = trim(buff);
                    string::size_type i =  curr_val.find_first_of(">") + 1;
                    string::size_type j =  curr_val.find_last_of("</") - 1;
                    curr_val = curr_val.substr(i,(j-i));

                    data.sValue = trim(curr_val);
                }
                if(buff.find(count)!= string::npos && pass > 7)
                {
                    curr_cnt = trim(buff);
                    string::size_type k =  curr_cnt.find_first_of(">") + 1;
                    string::size_type l =  curr_cnt.find_last_of("</") - 1;

                    curr_cnt = curr_cnt.substr(k,(l-k));
                    stringstream ss("");
                    ss << curr_cnt;
                    ss >> data.sCount;
                }

                prev_val = curr_val;
                prev_cnt = curr_cnt;
                prev_attr = curr_attr;
                pass++;
            }

        }
        if(depth==2) populate_two_d (cMap);
        else if(depth==3) populate_three_d (cMap2);
    }
    catch (string& e){ RetVal=-2; cout << e << endl; }

    return RetVal;
}

void populate_two_d ( map <string, struct content_1> & mm )
{
   map <string, struct content_1>::iterator it = mm.begin();
   vector<struct fields>::iterator vec;

   for ( ; it != mm.end(); it++)
   {
        cout <<"KEY: "<<(*it).first<<endl;
        for(vec=(*it).second.vLevelTwo.begin(); vec != (*it).second.vLevelTwo.end(); vec++)
        ;;//     cout <<(*it).first<<","<<(*vec).sValue<<","<< (*vec).sCount<<endl;
   }
}

void populate_three_d ( map <string, struct content_2> & mm )
{
   map <string, struct content_2>::iterator it = mm.begin();
   vector<struct fields>::iterator vec;
   vector<struct fields>::iterator vec2;

   for ( ; it != mm.end(); it++)
   {
        cout  <<"KEY: "<<(*it).first <<endl;
        for(vec=(*it).second.vLevelThree.begin(); vec != (*it).second.vLevelThree.end(); vec++)
        {
           for(vec2=(*it).second.vLevelThree.begin(); vec2 != (*it).second.vLevelThree.end(); vec2++)
           ;;//     cout  <<(*it).first<<","<<(*vec).sValue<<","<< (*vec).sCount <<","<<(*vec2).sValue<<","<< (*vec2).sCount<<endl;
        }
   }
}

const vector<string> get_data ( const string & filename )
{
    vector<string> data;

    string buff;
    string temp("=");
    string temp2(">");

    fstream file(filename.c_str(), ios::in);
    if(file.is_open())
    {
        int i = 0;
        while(!file.eof())
        {
            getline(file, buff);
            if ( i > 4 )
            {
               data.push_back(trim(buff));
            }
            i++;
        }
        file.close();
    }
    return data;
}
 
hi;
anyone willing to share there wisdom with me??
please, i need help...

daula
 
1. You have
Code:
#include <libxml/xmlreader.h>
Why? It seems you have libxml now and here: use it!

2. IMHO, no need in admin guys assistance to install libxml++: it's source modules, download and compile them.

3. Do you want to implement your own XML parser? Well, divide and rule: make a simplest xml tag selector function (from a text stream), debug it then call it for interesting tags and so on. Make XML syntax layer then scanner layer then processing layer, don't mix all of it in hard-coded monolite...
 
Actually, I did thought about using libxml but I couldn't figure how to retrieve the date.
I surely can use some help on how to walk the tree.
for instance, how can print the main node value/count followed by it's children's values/counts.
Please, see the following sample output:

Code:
200602,3122,000-005,305,U,4
200602,3122,000-005,305,M,57
200602,3122,000-005,305,I,5
200602,3122,000-005,305,F,220
200602,3122,000-005,305,C,1
200602,3122,000-005,305,A,18
200602,3122,005-010,478,U,18
200602,3122,005-010,478,M,82
200602,3122,005-010,478,I,14
200602,3122,005-010,478,F,330
200602,3122,005-010,478,C,1
200602,3122,005-010,478,A,33
200602,3122,010-015,707,U,20
200602,3122,010-015,707,M,109
200602,3122,010-015,707,I,25
200602,3122,010-015,707,F,490
200602,3122,010-015,707,C,6
200602,3122,010-015,707,B,1
200602,3122,010-015,707,A,56
200602,3122,015-020,219,U,8
200602,3122,015-020,219,M,34
200602,3122,015-020,219,I,3
200602,3122,015-020,219,F,160
200602,3122,015-020,219,C,1
200602,3122,015-020,219,A,13
200602,3122,020-025,941,U,30
200602,3122,020-025,941,M,131
200602,3122,020-025,941,I,17
200602,3122,020-025,941,F,683
200602,3122,020-025,941,C,6
200602,3122,020-025,941,A,74
.
.
.
200602,3122,075-100,26,U,1
200602,3122,075-100,26,M,7
200602,3122,075-100,26,I,2
200602,3122,075-100,26,F,11
200602,3122,075-100,26,A,5
 
I was thinking of xmlTextReader.
Any ideas??

Thanks
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top