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