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?
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
Was spricht denn bei Dir dagegen das ReadFile.Read() zu machen ? Irgendwann müssen die Daten doch eingelesen werden.
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(); |
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 | }
|
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.