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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.