C# xml Parser

Gast #1435167
Lesenswert?

Hallo zusammen,

ich habe folgendes Problem mit folgendem Code:


- <Summary>
  <Issues>14</Issues>
  <Warnings>232</Warnings>
  <Errors>102</Errors>
  <StartTime>Fri 01 Jan 1997, 09:19:48</StartTime>
  <ElapsedTime>00 hours, 01 minutes, 19 seconds</ElapsedTime>
</Summary>

Den Knoten Summary such ich mir mit:

 XmlTextReader ReadFile = new XmlTextReader("J:\\index.xml");

            while (ReadFile.Read())
            {
                switch (ReadFile.NodeType)
                {
                    case XmlNodeType.EndElement:

                        if (ReadFile.LocalName == "Summary")
                        {
....

allerdings möchte ich dann Schritt für Schritt als erstes die Issues, 
warnings und Errors anzeigen ohne jedesmal ReadFile.Read() machen zu 
müßen.

Gibt es eine Möglichkeit?
Gast #1435208
Lesenswert?

Das geht jetzt wie ich will:

Allerdings scheimt mir das umständlich sobald ich z.B issue gefunden 
habe nochmal ein ReadFile zu machen um an das Value zu gelangen
1
while (ReadFile.Read())
2
            {
3
                switch (ReadFile.NodeType)
4
                {
5
                    case XmlNodeType.EndElement:
6

7
                        //Suche nach den Einträgen Issues
8
                        if (ReadFile.LocalName == "Project")
9
                        {
10
                            Console.Write("<" + ReadFile.Name + ">");
11

12
                            while (ReadFile.Read())
13
                            {
14
                                switch (ReadFile.NodeType)
15
                                {
16
                                    case XmlNodeType.Element:
17

18
                                        if (ReadFile.LocalName == "Issues")
19
                                        {
20
                                            Console.Write("<" + ReadFile.Name + ">");
21
                                            ReadFile.Read();
22
                                            Console.WriteLine(ReadFile.Value);
23
                                        }
24
                                        if (ReadFile.LocalName == "Warnings")
25
                                        {
26
                                            Console.Write("<" + ReadFile.Name + ">");
27
                                            ReadFile.Read();
28
                                            Console.WriteLine(ReadFile.Value);
29
                                        }
30
                                        if (ReadFile.LocalName == "Errors")
31
                                        {
32
                                            Console.Write("<" + ReadFile.Name + ">");
33
                                            ReadFile.Read();
34
                                            Console.WriteLine(ReadFile.Value);
35
                                        }
36
                                        break;
37
                                }
38
                            }                          
39
                        }
40
                        break;
41
                }
42
            }
43

44
            Console.ReadLine();
#1435465
Lesenswert?

Einfacher wird's mit LINQ to XML
1
    string xs = "<?xml version=\"1.0\"?>" +
2
                    "<TestData>" +
3
                        "<Summary>" +
4
                            "<Issues>14</Issues>" +
5
                            "<Warnings>232</Warnings>" +
6
                            "<Errors>102</Errors>" +
7
                            "<StartTime>Fri 01 Jan 1997, 09:19:48</StartTime>" +
8
                            "<ElapsedTime>00 hours, 01 minutes, 19 seconds</ElapsedTime>" +
9
                        "</Summary>" +
10
                        "<Summary>" +
11
                            "<Issues>15</Issues>" +
12
                            "<Warnings>2321</Warnings>" +
13
                            "<Errors>1021</Errors>" +
14
                            "<StartTime>Fri 01 Jan 1998, 09:19:48</StartTime>" +
15
                            "<ElapsedTime>00 hours, 01 minutes, 19 seconds</ElapsedTime>" +
16
                        "</Summary>" +
17
                    "</TestData>";
18
   
19
    // Test xdoc from string    
20
    XDocument xd = XDocument.Parse(xs);
21
   
22
    // select all summaries with issues 
23
    var items = 
24
        from item in xd.Descendants("TestData").Descendants("Summary")
25
        where Convert.ToInt32(item.Element("Issues").Value) > 0
26
        select item;
27

28
    // iterate through results
29
    foreach (var xe in items) {
30
        res += xe.Element("Issues") + "\t";
31
        res += xe.Element("Warnings") + "\t";
32
        res += "\n";
33
    }
Gast #1435482
Lesenswert?

> Was bringt mir diese Validierung?
Du kannst dir dann sicher sein, dass die Form der XML-Eingangs korrekt 
ist, also dass alle nötigen Elemente enthalten sind und diese den 
richtigen Wertebereich haben. Dafür musst du aber auch ein Schema 
definieren (falls noch nicht vorhanden).
Das Schema kannst du dann auch dafür nutzen, um automatisch die nötigen 
Klassen zu erstellen. Da kannst du dir dann das manuelle parsen sparen.
#1435497
Lesenswert?

Gast schrieb:
>> Was bringt mir diese Validierung?
> Du kannst dir dann sicher sein, dass die Form der XML-Eingangs korrekt
> ist, also dass alle nötigen Elemente enthalten sind und diese den
> richtigen Wertebereich haben. Dafür musst du aber auch ein Schema
> definieren (falls noch nicht vorhanden).
> Das Schema kannst du dann auch dafür nutzen, um automatisch die nötigen
> Klassen zu erstellen. Da kannst du dir dann das manuelle parsen sparen.

Kurze Ergänzung:
Projekt->Hinzufügen->DataSet, die entsprechenden Einstellungen vornehmen 
und dann z.B. so
1
myDataSet ds = new myDataSet();
2
ds.ReadXml("xasd");
3
myDataSet.SummaryDataTable table = ds.Summary;
4
DataColumn col = table.IssuesColumn;
auf die Daten zugreifen

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren