Sie sind nicht angemeldet.

1

Montag, 26. Juli 2010, 23:46

C# Hilfe gesucht

hiho leute
ich möchte aus so einem XML File etwas mit C# auslesen.

Quellcode

1
2
3
4
5
<?xml version="1.0" standalone="yes" ?>
  <TESTXML>
    <Daten NAME1 ="peter" />
    <Daten NAME2 ="horst" />
  </TESTXML>

das geht dann immer so weiter bis ins unendliche

ich weiß wie ich es mache das er mir alle namen anzeigt, oder nur den ersten. Aber ich möchte nur den 2ten anzeigen lassen oder den 1000. .
hier mein momentaner code


C/C++-Quelltext

1
2
3
4
5
6
7
8
                uint nummer = 1;
                    XmlDocument doc = new XmlDocument();
                    doc.Load(@"C:\Users\Martin\Desktop\neu.xml");
                    XmlElement root = doc.DocumentElement;
                    foreach (XmlNode @daten in root.ChildNodes)
                    {
                        Console.WriteLine("NameX = " + @daten.Attributes["NAME" + nummer].InnerText);
                    }
Signatur

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Halloman« (27. Juli 2010, 09:57)


Flachland-Gorillas retten

2

Montag, 26. Juli 2010, 23:48

Wie wäre es zB mit ner einfachen Zählvariable und ner If-Abfrage in der Schleife?
Geht zwar bestimmt auch anders, aber das ist das Erste was mir da einfällt

3

Montag, 26. Juli 2010, 23:52

hmm...kann mir nich so wirklich vorstellen wie du das meinst ^^
Signatur

4

Dienstag, 27. Juli 2010, 09:58

Gibt es denn sonst noch evtl eine möglichkeit außer XML File. So etwas zu speichern
im Format
NAME1383 = "peter";
wie kann man das noch speichern?
Signatur

5

Dienstag, 27. Juli 2010, 10:55

Im Ini format
//
hast du schon root.ChildNodes[2] versucht? bzw root.ChildNodes[1]
Signatur

C/C++-Quelltext

1
2
3
4
[x]c/c++/cli 
[x]c#
[x]html/css
++ profi x) ++

6

Dienstag, 27. Juli 2010, 14:34

Quellcode

1
2
3
4
5
6
7
8
DataSet ds = new DataSet();
DataTable dt = new DataTable();

ds.ReadXml(@"C:\Users\Administrator\Desktop\blub.xml");
dt = ds.Tables[0];

Console.WriteLine(dt.Rows[0][0].ToString());
Console.Read();


edit: für speichern^^

ds / dt .WriteXML
Signatur

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »I3iLLiG« (27. Juli 2010, 14:57)


7

Mittwoch, 28. Juli 2010, 12:32

EDIT: genau is das was ich gesucht habe. DANKE =)
Signatur

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Halloman« (28. Juli 2010, 15:17)


8

Mittwoch, 28. Juli 2010, 18:46

I3iLLiG kann es sein das diese Methode bei über 4925 Lines nich mehr mitmacht?...ist bei mir so -.-
Signatur

9

Mittwoch, 28. Juli 2010, 23:41

kann eigentlich nicht sein,
oder bringst du was mit dne datesets / tables durcheinander?
Signatur

10

Donnerstag, 29. Juli 2010, 09:10

ach ne waren nur Zeichen dort die er nicht einlesen kann...hab sie rausgenommen...
bloß jetzt noch ein problem, wenn er jetzt die datei öffnet...macht er nichts mehr. hängt sich auch nicht auf oder so, sondern macht einfach nichts

EDIT: kann es daran liegen das das Dokument 80856 Lines hat? ^^

EDIT 2 : ich habs nach dem ausführen mal lange machen lassen, es kommt folgende Fehlermeldung :

C/C++-Quelltext

1
Exception of type 'System.OutOfMemoryException' was thrown.
Signatur

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Halloman« (29. Juli 2010, 09:39)


11

Donnerstag, 29. Juli 2010, 10:53

ich hab dir mal nen ziemliches unsauberes programm in C++ geschrieben. Die Stack-Klasse könnte man noch stark verbessern, aber es funktioniert...
Vllt. kannste dir damit ne Dll kompillieren, wenn du das nicht integrieren kannst...

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream>
#include <fstream>
//==================================>
using namespace std;

//ne FIFO-Struktur zum dynamischen abspeichern der Strings. Hab ich irgendwann mal zur Übung geschrieben und hab endlich mal ne Möglichkeit das modifiziert einzusetzen :)
//die is hier gerade ziemlich unsauber, aber ich habe gerade nur noch sehr wenig Zeit ^^ Wen d Lust hast, kannst du die ganzen unnützen Variablen noch löschen und das ganze nohc mal um die Hälfte der Zeilen verkürzen
class tnode
{
      public:
             char *data;
             tnode *next;
             tnode *last;
             int bytes;
             bool isend;
};

class rohr
{
      public:
             rohr();
             void pop(char *string);
             void push(char *string, unsigned int bytes_to_write);
             int getNextbytes();
             bool isEnd();
      private:
              tnode *anfang;
              tnode *ende;
};

rohr::rohr()
{
            anfang = 0;
            ende = 0;
}
void rohr::push(char *string, unsigned int bytes_to_write)
{
    tnode *last;
    tnode *node = new tnode;
    if (anfang==0)
    {
        node->last = 0;
        anfang=node;  //falls es noch keinen anfang gibt, nehme den hier
        ende = 0;
        anfang->isend = true;
    }
    else
    {
        ende->next = node;
        node->last = ende;
        node->isend = false;
    }
    ende = node;
    node->data = (char *) malloc(bytes_to_write+1);
    strcpy(node->data, string);
    node->bytes = bytes_to_write;
}

int rohr::getNextbytes()
{
    return anfang->bytes;
}

void rohr::pop(char *string)
{

    int bytes = anfang->bytes;
    memset(string, 0, bytes);
    strcpy(string, anfang->data);
    //=============>Ab hier ist die Datenberechnung zu Ende
    tnode *old;
    old = anfang;
    anfang = anfang->next;
    delete old;
}

void strcpyex(char *ziel, char const *quelle, unsigned int bytes_to_cpy)
{
    memset(ziel, 0, bytes_to_cpy+1);
    for (int i=0;i<bytes_to_cpy;i++)
    {
        ziel[i] = quelle[i];
    }
}

// Funktioniert bis zu einer Dateigröße von 4 GB (is wohl bei einer XML Datei nicht so tragisch)
// So lange unsigned int 32 Bit hat
unsigned int getFileSize(const char *file_name)
{
   std::ifstream file(file_name);
   file.seekg(0,std::ios::end);
   return file.tellg();
} //==>by eViLiSSiMo (schnell mal gegooglet)

bool isPattern(char *buffer, char const *pattern, unsigned int MAX_BYTES)
{
    //printf("isPattern called:\nbuffer : %s\npattern: %s\nMAX_BYTES: %d\n\n", buffer, pattern, MAX_BYTES);
    for (unsigned int i=0;i<MAX_BYTES;i++)
    {
        if (buffer[i]!=pattern[i]) return false;
    }
    return true;
}

int main(int argc, char argv[])
{
    unsigned int anz = 0;
    rohr speicher;
    int a = 0;
    char const pattern[] = "<Daten NAME";
    const char filename[] = "test.txt";
    unsigned int size_f = getFileSize(filename) + 1;
    char buffer[size_f];
    //====>Auslesen
    fstream f("test.txt", ios::in);
    f.read(buffer, size_f);
    f.close();
    //==>Auswerten
    char swap[100]; //länger wird der Name wohl nicht sein. Ansonsten musst du ihn eben noch vergrößern
    for (unsigned int i=0;i<size_f-4;i++)
    {
        if (isPattern(buffer+i, pattern, sizeof(pattern)-2)) //wenn er ein Namen gefunden hat
        {
            for (a=0;buffer[i+a]!='/';a++)
            {
            }
            strcpyex(swap, buffer+i, a-1);
            speicher.push(swap, a);
            anz += 1;
        }
    }
    //==========>Ausgeben
    for (int i=0;i<anz;i++) //das ist jetzt natürlich nicht ästhetisch, aber es funktioneirt ;)
    {
        speicher.pop(swap);
        printf("%s\n", swap);
    }
    return 0;
}

mfg @night@
Signatur "Um im Internet zu surfen brauch man eine IP. Einen IQ leider nicht..."
-Woki

Ich gebe niemanden eine positive Bewertung, der darum bettelt! :pinch:

GUI-Tutorial: Klick!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »@night@« (29. Juli 2010, 10:54)