mikrocontroller.net

Forum: PC-Programmierung C# xml Parser


Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest dein XML zuerst mit dem Schema(XSD) validieren, zB so:
http://aspalliance.com/941_Validating_XML_Files_Ag...

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bringt mir diese Validierung?

Autor: NurEinGast (Gast)
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest einen DOM-Parser benutzen.

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
while (ReadFile.Read())
            {
                switch (ReadFile.NodeType)
                {
                    case XmlNodeType.EndElement:

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

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

                                        if (ReadFile.LocalName == "Issues")
                                        {
                                            Console.Write("<" + ReadFile.Name + ">");
                                            ReadFile.Read();
                                            Console.WriteLine(ReadFile.Value);
                                        }
                                        if (ReadFile.LocalName == "Warnings")
                                        {
                                            Console.Write("<" + ReadFile.Name + ">");
                                            ReadFile.Read();
                                            Console.WriteLine(ReadFile.Value);
                                        }
                                        if (ReadFile.LocalName == "Errors")
                                        {
                                            Console.Write("<" + ReadFile.Name + ">");
                                            ReadFile.Read();
                                            Console.WriteLine(ReadFile.Value);
                                        }
                                        break;
                                }
                            }                          
                        }
                        break;
                }
            }

            Console.ReadLine();

Autor: Thomas L. (tom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was spricht dagegen XPath zu verwenden?

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfacher wird's mit LINQ to XML
    string xs = "<?xml version=\"1.0\"?>" +
                    "<TestData>" +
                        "<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>" +
                        "<Summary>" +
                            "<Issues>15</Issues>" +
                            "<Warnings>2321</Warnings>" +
                            "<Errors>1021</Errors>" +
                            "<StartTime>Fri 01 Jan 1998, 09:19:48</StartTime>" +
                            "<ElapsedTime>00 hours, 01 minutes, 19 seconds</ElapsedTime>" +
                        "</Summary>" +
                    "</TestData>";
   
    // Test xdoc from string    
    XDocument xd = XDocument.Parse(xs);
   
    // select all summaries with issues 
    var items = 
        from item in xd.Descendants("TestData").Descendants("Summary")
        where Convert.ToInt32(item.Element("Issues").Value) > 0
        select item;

    // iterate through results
    foreach (var xe in items) {
        res += xe.Element("Issues") + "\t";
        res += xe.Element("Warnings") + "\t";
        res += "\n";
    }

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht 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
myDataSet ds = new myDataSet();
ds.ReadXml("xasd");
myDataSet.SummaryDataTable table = ds.Summary;
DataColumn col = table.IssuesColumn;
auf die Daten zugreifen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.