Forum: PC-Programmierung C# xml Parser


von Heinz (Gast)


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?

von Gast (Gast)


Lesenswert?

Du könntest dein XML zuerst mit dem Schema(XSD) validieren, zB so:
http://aspalliance.com/941_Validating_XML_Files_Against_XSD_Schemas_in_NET_1x_and_20.3

von Heinz (Gast)


Lesenswert?

Was bringt mir diese Validierung?

von NurEinGast (Gast)


Lesenswert?

Was spricht denn bei Dir dagegen das ReadFile.Read() zu machen ?
Irgendwann müssen die Daten doch eingelesen werden.

von Sven P. (Gast)


Lesenswert?

Du könntest einen DOM-Parser benutzen.

von Heinz (Gast)


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();

von Thomas L. (tom)


Lesenswert?

Was spricht dagegen XPath zu verwenden?

von Arc N. (arc)


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
    }

von Gast (Gast)


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.

von Arc N. (arc)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.