Autor Beitrag
DeTomaso33
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52
Erhaltene Danke: 1

Windows10
C#,HTML,CSS3,Javascript
BeitragVerfasst: Mi 20.01.16 12:03 
Hallo Leser,

ich habe bei meiner Konvertierung von einer reinen .txt-Datei ein Problem mit einer InvalidOperationException. Meinen Quellcode habe ich beigefügt und die Fehlermeldung in den Anhang gesetzt. Dieser Block ist der zweite Teil zum Thema "Einlesen von .doc in .xml Format" (Teil 1 behandelt eine ArgumentException)!

Danke vorab für die Beschäftigung mit der Problematik! :)
P.S.: Wie bekomme ich es hin,dass mein Quellcode wohlgeformt ist? Also beim Reinkopieren hat er noch die entsprechende Struktur...

mfg
DeTomaso33
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.IO;

namespace XMLforTestserie
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var fileInfo = new FileInfo(@"C:\Users\T\Documents\Test-Serie.txt");
                string pfad = @"C:\Users\T\Documents\Test-Serie.txt";


                // Prüfen ob die Datei existiert
                if (File.Exists(pfad))
                {
                    List<string> liLines = new List<string>();
                    string path = Path.GetFullPath(pfad);
                    liLines.AddRange(System.IO.File.ReadAllLines(path, Encoding.Default));
                    string ausgabe = string.Empty;
                    string inhalt = string.Join(null, liLines.ToArray());

                    using (XmlWriter writer = XmlWriter.Create(@"C:\Users\T\Documents\testserie1.xml"))
                    {
                        writer.WriteStartDocument();
                        writer.WriteStartElement("Dokument");

                        // Artikel müssen aus liLines geholt werden.
                        writer.WriteStartElement("Inhalt");

                        foreach (string s in inhalt.Split('|'))
                        {
                            if (s != null)
                            {
                                //Die gesplitteten Daten erhalten für die einzelnen xml-Elemente die gewünschten Tags.
                                writer.WriteElementString("Titel", s.Split('$')[1]);
                                writer.WriteElementString("THEMA", s.Split('$')[2]);
                                writer.WriteElementString("Modell", s.Split('$')[3]);
                                writer.WriteElementString("Abschnitt", s.Split('$')[4]);
                                writer.WriteElementString("Bildtitel", s.Split('$')[5]);
                                writer.WriteElementString("HINWEIS", s.Split('$')[6]);
                                writer.WriteElementString("Unterabschnitt1", s.Split('$')[7]);
                                writer.WriteElementString("Unterabschnitt2", s.Split('$')[8]);
                                writer.WriteElementString("Unterabschnitt3", s.Split('$')[9]);
                                writer.WriteElementString("Abschnitt", s.Split('$')[10]);
                                writer.WriteElementString("Unterabschnitt4", s.Split('$')[11]);
                                writer.WriteElementString("Unterabschnitt5", s.Split('$')[12]);
                                writer.WriteElementString("Unterabschnitt6", s.Split('$')[13]);
                                writer.WriteElementString("HINWEIS", s.Split('$')[14]);
                                writer.WriteElementString("Bildtitel", s.Split('$')[15]);
                            }
                            writer.WriteEndElement();

                           
                        }
                        writer.WriteEndElement();
                        writer.WriteEndDocument();

                    }
                    

                }
                else
                {
                    Console.WriteLine("Die Datei Test-Serie.txt wurde nicht gefunden.");
                }
            }
            catch (IOException ex)
            {
                Console.WriteLine(ex);
            }
        }
    }
}


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Einloggen, um Attachments anzusehen!
tomte
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19
Erhaltene Danke: 5

Win 7, Win 8.1, Win 10, Win Server 2012

BeitragVerfasst: Mi 20.01.16 12:15 
Du musst writer.WriteStartElement("Inhalt") in die foreach Schleife verschieben.
Denn so wie du es jetzt hast mit writer.WriteStartElement("Inhalt") vor der Schleife und das dazugehörige writer.WriteEndElement() in der Schleife kann es nicht funktionieren, da das Element öfter geschlossen wird, als es geöffnet wurde.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt

Für diesen Beitrag haben gedankt: DeTomaso33
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 20.01.16 12:38 
Wie sieht den der Inhalt der txt Dateti aus?
Zeilenweise Datei einlesen, damm umkopieren, wieder zusammenbauen um es dann nach | und $ zu splitten sieht (sorry) krank aus.

Zitat:
P.S.: Wie bekomme ich es hin,dass mein Quellcode wohlgeformt ist?


Meinst du das entstehende XML und nicht denn Quellcode? Wohlgeformt ist eher eine Begrifflichkeit aus der XML Szene. Unter Softwerkern spricht man eher weniger so vom Sourcecode.
Wenn das gemeint ist dann würde ich eher empfehlen eine XMLSerializer Klasse zu verwenden der liefert dir automatisch wellformed XML. Das entkoppelt dann auch die Einzelteile deiner Anwendung besser.
Also Einlesen der Daten in eine Liste von Klassen und dann den XMLSerializer die Liste von Klassen wegschreiben lassen.

Du schreibst Elemente mit dem gleichen Namen (Abschnitt,Bildtitel etc.)an den gleichen Knoten. Bug?


Zuletzt bearbeitet von Ralf Jansen am Mi 20.01.16 13:01, insgesamt 1-mal bearbeitet
tomte
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19
Erhaltene Danke: 5

Win 7, Win 8.1, Win 10, Win Server 2012

BeitragVerfasst: Mi 20.01.16 13:00 
Für die Formatierung von C# Code hier im Forum musst du den Code in die entsprechenden Tags einbetten.

ausblenden Quelltext
1:
2:
3:
[cs]
hier kommt der Code hin
[/cs]


edit: So wie es Th69 nun geändert hat.

Für diesen Beitrag haben gedankt: DeTomaso33
DeTomaso33 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52
Erhaltene Danke: 1

Windows10
C#,HTML,CSS3,Javascript
BeitragVerfasst: Mi 20.01.16 13:29 
Hallo,

Tomte hat es erfasst, was ich nicht eindeutig formuliert habe bzgl. der Formatierung des C# Quellcodes. Klar "wohlgeformt" sagt man nur bei Xml. Ich will dem Moderator ja nicht unnötig Arbeit machen. :oops:

mfg
DeTomaso33

...weitere Antwort kommt!!! :arrow:
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 20.01.16 13:35 
Zitat:
Klar "wohlgeformt" sagt man nur bei Xml. Ich will dem Moderator ja nicht unnötig Arbeit machen.


Duh :roll: Mein Fehler ich dachte echt es geht dir um deine Anwendung aber es ging dir um die Darstellung hier im Forum. Hab ich nicht begriffen.
DeTomaso33 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52
Erhaltene Danke: 1

Windows10
C#,HTML,CSS3,Javascript
BeitragVerfasst: Mi 20.01.16 15:07 
Weiter geht's!

Meine .txt Datei (s.Anhang) ist nur eine Beispieldatei, die mir helfen soll meine Textbausteine, Titel usw. als Tag abzulegen. Zu Deinem Einwand Ralf (Bug) kann ich nur sagen: Hauptsache1 jeweils als eine Kategorie abgespeichert und Hauptsache2 per XSLT eindeutig auszuwählen. Die Zuordnung zu nur einem Knoten ist irrelevant für den Moment, werde ich aber ändern bei Bedarf.

Thema meiner Textdatei: "Auto" (hätte auch sonst was sein können!) :idea:

Zum kritiseirten Splitting: Es heißt nun mal,dass in der Datenverarbeitung viele Daten per .xml verarbeitet werden. Alternative wäre eine Datenbank, nur die müßte erst aufgebaut werden. Mein später verwendeter Schriftsatz soll als Grundlage für mehrere kleine html-Seiten dienen, die zusätzlich noch ein erklärendes Bild erhalten. Klar kann man sagen es ist umständlich, aber die html-Seiten müssen so oder so aufgebaut werden...hier halt mit xml-Bausteinen.
Nachher ist evtl. noch ein frz. Datensatz geplant (kann man so im Ansatz der Test-serie.txt Datei entnehmen. :wink:

mfg
DeTomaso33
Einloggen, um Attachments anzusehen!
DeTomaso33 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52
Erhaltene Danke: 1

Windows10
C#,HTML,CSS3,Javascript
BeitragVerfasst: Mi 20.01.16 15:36 
Hi nochmal,

wenn man/frau es so macht wie tomte es in der ersten Antwort beschrieben hat, bleibt die InvalidOperationException aus. Ein echter Bigpoint von tomte!
Kleiner Restfehler: Meine Tags haben nicht immer den richtigen Inhalt. Daran muss ich noch arbeiten. Es liegt daran, dass man eine Struktur wie:
1
1.1 hier gibt es keine Unterpunkte vom Level3
1.2
1.2.1
1.2.2 hier müssen die obersten 2Kategorien unberücksichtigt bleiben oder wiederholt werden
1.3
2
hat und evtl. leere Elemente (eine 0)erzeugt werden müssen. :shock:

mfg
DeTomaso33
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 20.01.16 15:44 
Zitat:
Zum kritiseirten Splitting: Es heißt nun mal,dass in der Datenverarbeitung viele Daten per .xml verarbeitet werden


XML ist 'ne tolle Sache. Dein Code dazu sah nur so nur unnötig kompliziert aus ;)

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
string inhalt = File.ReadAllText(Path.GetFullPath(pfad), Encoding.GetEncoding(1252)); //.Replace(Environment.NewLine, ""); wenn Zeilenümbrüche raus sollen
foreach (string line in inhalt.Split('|'))
{
    var values = line.Split('$');
    if (values.Length < 16)
        throw new MyLovelyException("MyLovelyProblem");

    // blah
    writer.WriteElementString("Titel", values[1]);
    //... u.s.w.
}

Für diesen Beitrag haben gedankt: DeTomaso33