mal abgesehen von dem UTF-Kram;
bei bekannter Struktur lässt sich ein simpler XMLReader auch mal schnell selbst entwerfen, der die Daten dann auch gleich in die struct packt:
enum { MAXATTR = 7 };
typedef char string[100];
typedef struct { string x; } sstring;
typedef struct { string key; int off; } Map;
typedef struct { string Hausnr, LandesCd, Ort, PLZ, PersArtCd, Personennr, Strasse; } xperson;
typedef struct { string Familienname, FamilienstandCd, Gebdat, GeschlechtCd, LandesCd, Vorname; } nperson;
typedef struct { string Name, SonstPersArtCd; } sperson;
typedef struct { string TxtArtCd, TxtInhalt; } elText;
typedef struct { xperson p; nperson n; sperson s; elText t[3]; } Person;
struct { string tag; int off; Map map[MAXATTR]; } map[] = {
{"PERSON",offsetof(Person,p),{{ "Hausnr",0 }, { "LandesCd",offsetof(xperson,LandesCd) }, { "Ort",offsetof(xperson,Ort) }, { "PLZ",offsetof(xperson,PLZ) }, { "PersArtCd",offsetof(xperson,PersArtCd) }, { "Personennr",offsetof(xperson,Personennr) }, { "Strasse",offsetof(xperson,Strasse) }}},
{"NATUERLICHE_PERSON",offsetof(Person,n),{{ "Familienname",0 }, { "FamilienstandCd",offsetof(nperson,FamilienstandCd) }, { "Gebdat",offsetof(nperson,Gebdat) }, { "GeschlechtCd",offsetof(nperson,GeschlechtCd) }, { "LandesCd",offsetof(nperson,LandesCd) }, { "Vorname",offsetof(nperson,Vorname) }}},
{"SONSTIGE_PERSON",offsetof(Person,s),{{ "Name",0 }, {"SonstPersArtCd",offsetof(sperson,SonstPersArtCd) }}},
{"EL-Text",offsetof(Person,t),{{ "TxtArtCd",0 }, {"TxtInhalt",offsetof(elText,TxtInhalt) }}} };
int tagof(char* s)
{
for (int i = 0; i < sizeof(map) / sizeof * map; ++i)
if (!strcmp(s, map[i].tag)) return i + 1;
return 0;
}
int indexof(char* s, int off, Map* map)
{
for (int i = 0; i < MAXATTR; ++i)
if (!strcmp(map[i].key, s)) return off + map[i].off;
}
int quotecheck(char* s)
{
int i = 0;
while (*s)
if (*s++ == '\"') ++i;
return i == 0 || i == 2;
}
char* readtoken(FILE* f, char* x)
{
*x = 0;
string tmp = "";
while (1 == fscanf(f, "%99s", tmp) && (strcat(x, *x ? " " : ""), strcat(x, tmp), !quotecheck(x)));
return *x ? x : 0;
}
void copy(string dest, string src)
{
*(sstring*)dest = *(sstring*)src;
}
Person person[100];
int main()
{
FILE* f = fopen("Person.xml", "r");
string w;
int level = -1, p = -1;
while (readtoken(f, w))
{
int i;
if (i = tagof(w + 1))
{
level = i - 1;
if (level == 0) p++;
}
else
if (level > -1)
{
string key, value;
if (2 == sscanf(w, "%[^=]=\"%[^\"]", key, value))
{
sstring* ptr = (char*)(person + p) + indexof(key, map[level].off, map[level].map);
while (*(char*)ptr) ptr++;
copy(ptr, value);
}
}
}
fclose(f);
p = 0;
while (*person[p].p.Hausnr)
{
printf("\n\n%s,%s,%s,%s,%s,%s,%s", person[p].p.Hausnr, person[p].p.LandesCd, person[p].p.Ort, person[p].p.PersArtCd, person[p].p.Personennr, person[p].p.PLZ, person[p].p.Strasse);
printf("\n%s,%s,%s,%s,%s,%s", person[p].n.Familienname, person[p].n.FamilienstandCd, person[p].n.Gebdat, person[p].n.GeschlechtCd, person[p].n.LandesCd, person[p].n.Vorname);
printf("\n%s,%s", person[p].s.Name, person[p].s.SonstPersArtCd);
printf("\n%s,%s,%s,%s", person[p].t[0].TxtArtCd, person[p].t[0].TxtInhalt, person[p].t[1].TxtArtCd, person[p].t[1].TxtInhalt);
p++;
}
return 0;
}
99,AUT,Kaindorf bei Hartberg,S,2918745850@13866256,8224,Kaindorf
,,,,,
Ihr Versicherungsmakler GmbH,0
,,,
88,AUT,Kaindorf bei Hartberg,N,2918965473@15462572,8224,Strada
Famnam,0,1973-05-14,2,AUT,Vornam
,
,,,
1,AUT,Wien,N,2918072343@11435234,1210,Versicherungsstraße
Mustermax,0,1966-04-29,1,AUT,Nikolaus
,
ANR,Herr,TIT,Ing.
2,AUT,Wien,N,2918072344@11435237,1210,Versicherungsstraße
Mustermax,0,1967-05-14,2,AUT,Silvia
,
ANR,Frau,TIT,Mag.
3,AUT,Wien,N,2918072345@11435242,1210,Versicherungsstraße
Mustermax,0,1996-02-03,2,AUT,Caroline
,
ANR,Frau,,
4,AUT,Wien,N,2918072346@11435245,1210,Versicherungsstraße
Mustermax,0,1998-03-02,2,AUT,Hanna
,
ANR,Frau,,