C# Bestimmte Wörter aus bestehender xml Datei auslesen


krrrambambuli

Grünschnabel
Hallo!
Also ich habe eine bestehende, ziemlich große, .xml Datei, auf welchen Inhalt ich keinen Einfluss habe.
Aus dieser Datei möchte ich nur einige bestimmte Wörter auslesen und weiterverarbeiten.
Ich habe ein kleines Programm geschrieben. Die ersten Zeilen funktionieren problemlos, doch dann kommt der Fehler: "Es sind mehrere Stammelemente vorhanden..."
In diesem Fall liegt das wohl am doppelten "String". Wie kann ich die Datei dennoch auslesen?

Code:
...
   XmlReader reader;
            reader = XmlReader.Create(@"D:\User\Testprogramme\TIA\System\TIA-Export2.xml");
            List<Gegenstand> liste = new List<Gegenstand>();
            Gegenstand Teil = null;
           
         while (reader.Read()) {
         // prüfen, ob es sich aktuell um ein Element handelt
         if (reader.NodeType == (XmlNodeType.Element)) {
         // alle relevanten Elemente untersuchen
       
             switch(reader.Name) {
             case "array":
             // neue Person erzeugen und in Liste eintragen
            Teil = new Gegenstand();
            liste.Add(Teil);
            break;
           
             case "string":
                Teil.name = reader.ReadString();  
             break;
...


Auszug aus .xml Datei:
Code:
<?xml version="1.0" encoding="utf-8" ?> 
...
                    <array id="2113564">
                <System.Array.Int32>
                </System.Array.Int32>
              </array>
              <string>schalter2</string>
              <uint32>2</uint32>
              <int32>1</int32>
...
 

krrrambambuli

Grünschnabel
Hey!
Ja hatte ich auch schon versucht. Aber damit kommt der selbe Fehler.... hier der Code:
Code:
            XmlDocument document = new XmlDocument(); 
            document.Load(@"D:\User\Testprogramme\TIA\System\TIA-Export2.xml"); 
            XmlNodeList nodes = document.GetElementsByTagName("string"); 
            // für alle Nodes in der Liste 
            { 
                foreach (XmlNode node in nodes) 
                { 
                    XmlElement element = (XmlElement)node; 
                    string s = element.InnerText; 
                } 
            }

Dann habe ich eine Möglichkeit gefunden den Code wohl anzupassen um den dann auszulesen. Jedoch kann ich dann debuggen, aber nichts mehr auslesen. Versucht hatte ich das damit:
Code:
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlReader reader = XmlReader.Create(new StringReader(xmlString), settings);
...

Wenn noch jemand was weiß, bitte sagen :)
 

Tscheftschenko

Grünschnabel
Hört sich irgendwie nach einem Fehler in der XML-Datei an. Das Ganze funktioniert evtl. so lange, bis das root-Element geschlossen wird. Folgen dann noch weitere Elemente gibts einen Fehler. Poste doch mal eine komplette Datei.
 

krrrambambuli

Grünschnabel
Also die kleinste .xml Datei die ich momentan zum testen habe ist 6Mb groß. Daher zeige ich lieber nur einen Ausschnitt, oder?
Wenn ich das Programm in VisualStudio mit Breakpoints durchlaufe, funktioniert es solange, bis eine Zeile mit zweimal der selben Angabe kommt, in diesem Fall [string] ... [/string].
Macht ja auch Sinn bei der Fehlermeldung, aber was soll ich da machen :(
Code:
...
  </relationId2Name>
  <rootObjects>
    <entry name="Products" objectId="266243-1056" />
    <entry name="Packages" objectId="266241-1057" />
    <entry name="Project" objectId="135208-1073" />
    <entry name="CultureContainer" objectId="69640-1079" />
    <entry name="Library" objectId="135188-1081" />
    <entry name="PersistenceInfo" objectId="69638-1087" />
    <entry name="ElementaryDataTypesContainer" objectId="135173-1088" />
  </rootObjects>
  <objects lastInstanceId="4032" objectCount="2763">
    <StorageObject id="266243" instId="1056" clusterId="0">
      <attribSet id="77825">
        <attrib name="IsShell">
          <boolean>false</boolean>
        </attrib>
        <attrib name="Name">
          <string>Products</string>
        </attrib>
      </attribSet>
      <parentlink relId="0" link="0-0" />
      <relation id="270344">
        <link>266244-1059</link>
        <link>266244-1062</link>
        <link>266244-1064</link>
        <link>266244-1066</link>
        <link>266244-1068</link>
        <link>266244-1070</link>
        <link>266244-1071</link>
...
 

Spyke

Premium-User
Kannst du mal die original Fehlermeldung posten und ev. kannste ja noch den XML ausschnitt zeigen wo er eventuell meint die XML ist kaputt.
Aber ich vermute auch erstmal wie @Tscheftschenko das die XML datei kaputt ist.
 

Tscheftschenko

Grünschnabel
Hast du die Datei (bzw. eine der Dateien) mal nach VS geladen? Da werden nämlich auch Fehler in XML aufgespürt.
Wenn ich da mehrere Wurzel/Stamm/root-Elemente habe kommt :
"XML-Dokument kann nicht über mehrere Stammebenenelemente verfügen."
 

krrrambambuli

Grünschnabel
Okay, also ich hab jetzt einfach (wie oben) ein paar Zeilen aus der .xml Datei in eine neue, kleinere, .xml Datei herauskopiert. Solche Abschnitte kommen dort häufiger vor. Z.B., ist eines meiner Ziele alle "schalter1, schalter2,..." aus der Datei zu lesen.
Wenn ich diese mit meinem C# Code auslesen will kommt folgende Fehlermeldung:

Code:
<?xml version="1.0" encoding="utf-8" ?> 

                    <array id="2113564">
                <System.Array.Int32>
                </System.Array.Int32>
              </array>
                    <string>schalter2</string>
              <uint32>2</uint32>
              <int32>1</int32>

Fehlermeldung:
"Ein Ausnahmefehler des Typs "System.Xml.XmlException" ist in System.Xml.dll aufgetreten.

Zusätzliche Informationen: Es sind mehrere Stammelemente vorhanden. Zeile 7, Position 22."

@Tscheftschenko: Wie kann ich in VS xml Dateien anaylsieren lassen? Ich kann es zwar importieren, sehe aber keine passende Funktion zum Fehlersuchen.
 

Improof

Erfahrenes Mitglied
Hi!

Ich würde mal vermuten, du kennst dich nicht wirklich gut mit dem XML-Format aus, oder? ;)

Code:
<?xml version="1.0" encoding="utf-8" ?>

                    <array id="2113564">
                <System.Array.Int32>
                </System.Array.Int32>
              </array>
                    <string>schalter2</string>
              <uint32>2</uint32>
              <int32>1</int32>

Fehlermeldung:
"Ein Ausnahmefehler des Typs "System.Xml.XmlException" ist in System.Xml.dll aufgetreten.

Zusätzliche Informationen: Es sind mehrere Stammelemente vorhanden. Zeile 7, Position 22."

"Es sind mehrere Stammelemente vorhanden" bedeutet, dass du mehr als ein root-tag im XML hast. Und genau das ist bei dir der Fall.

Ich werd's dir mal kurz anhand deiner simplen Testdaten erklären:

In Zeile 1 legst du Metadaten fest, in deinem Fall die Version auf 1.0 und das Encoding auf UTF-8
In Zeile 3 folgt dann dein root-tag. Dieses Tag darf nur einmal vorkommen und muss das erste sowie letzte Tag (außer Metadaten) sein. Du machst das root-tag allerdings in Zeile 6 wieder zu...was in Zeile 7 zu deinem Fehler führt, da du ein neues root-tag öffnen willst, noch dazu mit anderem Namen (du kannst keine 2 root-tags haben, selbst, wenn diese gleich heißen!).

Du solltest deine XML-Datei anders formatieren, damit du einen besseren Überblick über die Daten hast. Wenn du z.B. nach jedem öffnenden Tag eine Einrückung machst dann siehst du ohne die Datei überhaupt lesen zu müssen, dass hier etwas nicht stimmen kann:

Code:
<?xml version="1.0" encoding="utf-8" ?>
<array id="2113564">
   <System.Array.Int32>
   </System.Array.Int32>
</array>
<string>schalter2</string>
<uint32>2</uint32>
<int32>1</int32>

Ich vermute mal, dass das auch in deiner großen Datei der Fehler ist. :)

Gruß
Daniel
 

Tscheftschenko

Grünschnabel
VS hat doch deine Daten schon ein bisschen analysiert. Etwas wie "Zeile 7, Position 22" kann schon ziemlich hilfreich sein bei >6MB großen Dateien. Ausserdem kannst du hier XSD erstellen lassen und dein Dokument automatisch formatieren lassen, wie von Improof vorgeschlagen.

Ich hab das gerade mal ausprobiert. Automatisch ein Schema erstellen klappt jetzt nicht wirklich gut, da macht VS beim Erstellen keine Syntaxprüfung der XML-Datei und schreibt dann entsprechenden Mist. Jetzt muss meine XML-Datei 2 Stammelemente haben :rolleyes: Und mit der Syntax (ja ich weiß, ist auch nur wieder XML) muss man dann auch wieder klarkommen.

Jedenfalls ist eine XML-Datei mit mehreren Stammelementen keine gültige XML-Datei - der Begriff daführ heisst "Wohlgeformt" wenn ich mich da richtig erinnere. Zur Not vielleicht in Zeile 2 <meinXML> und in die letzte Zeile </meinXML> geschrieben. Dann ist nur noch ein Stammelement da.
 

krrrambambuli

Grünschnabel
@Improof: danke für die Erklärung, du hast recht, ich habe wirklich keine Erfahrung mit .xml :p
Ich habe jetzt mal nen .xml Crashkurs gemacht, zumindest weiss ich jetzt das nötigste!
...und @Tscheftschenko: Ich habe jetzt einfach manuell ein Stammelement hinzugefügt, jetzt gehts, ich bekomme fürs erste genug Informationen aus der Datei!!

Der nächste Schritt ist es jetzt, nach bestimmten Daten zu suchen. Mal sehen wie's klappt :)
 

Forum-Statistiken

Themen
272.355
Beiträge
1.558.614
Mitglieder
187.830
Neuestes Mitglied
hansmeiser