2008-09-05 10 views

Antwort

9

Möchten Sie einen SAX-Parser Stilelement und dem XmlTextReader mit XmlReader.Create erstellte Klasse wäre eine gute Idee sein, ja. Hier ist ein leicht modifizierten Codebeispiel aus CodeGuru:

void ParseURL(string strUrl) 
{ 
    try 
    { 
    using (var reader = XmlReader.Create(strUrl)) 
    { 
     while (reader.Read()) 
     { 
     switch (reader.NodeType) 
     { 
      case XmlNodeType.Element: 
      var attributes = new Hashtable(); 
      var strURI = reader.NamespaceURI; 
      var strName = reader.Name; 
      if (reader.HasAttributes) 
      { 
       for (int i = 0; i < reader.AttributeCount; i++) 
       { 
       reader.MoveToAttribute(i); 
       attributes.Add(reader.Name,reader.Value); 
       } 
      } 
      StartElement(strURI,strName,strName,attributes); 
      break; 
      // 
      //you can handle other cases here 
      // 
      //case XmlNodeType.EndElement: 
      // Todo 
      //case XmlNodeType.Text: 
      // Todo 
      default: 
      break; 
      } 
     } 
     } 
     catch (XmlException e) 
     { 
     Console.WriteLine("error occured: " + e.Message); 
     } 
    } 
    } 
} 
+0

Ein paar Dinge, die ich bemerkt: Die catch-Anweisung ist an der falschen Stelle (nach der zweiten bis letzten schließenden geschweiften Klammer sein sollte) und Es gibt eine zusätzliche schließende geschweifte Klammer nach der letzten break-Anweisung (es versucht, die case-Anweisung zu schließen, aber Sie schließen nur die switch-Anweisung). Außerdem kann ich nicht herausfinden, woher die StartElement-Methode stammt, oder soll das eine Dummy-Methode sein, die durch Benutzercode ersetzt werden soll? –

0

Ich denke, es ist nicht möglich, wenn Sie Objektmodell (d. H. XElement \ XDocument) XML abfragen möchten. Natürlich können Sie keine XML-Objekte erstellen, ohne genügend Daten zu lesen. Sie können jedoch XmlReader Klasse verwenden.

Die XmlReader-Klasse liest XML-Daten aus einem Stream oder einer Datei. Es bietet non-cached, nur vorwärts, schreibgeschützt Zugriff auf XML-Daten.

0

Ich bin verwirrt durch die Erwähnung der Verwendung sollte „xs: sequence“ - das ist ein XML-Schemaelement

Versuchen Sie, eine große XML-Schema-Datei zu öffnen? Öffnen Sie eine große XML-Datei, die auf diesem Schema basiert? Oder versuchen Sie, eine große XML-Datei zu öffnen und gleichzeitig zu validieren?

Keine dieser Situationen sollte Ihnen ein Problem mit dem Standard XmlReader (oder XmlValidatingReader) bieten.

Lesen von XML mit XMLReader: http://msdn.microsoft.com/en-us/library/9d83k261(VS.80).aspx

0

Das Codebeispiel versucht XmlReader Artcode in SAX Artcode zu drehen - wenn Sie Code von Grund auf neu zu schreiben sind würde ich nur XmlReader verwenden, wie es beabsichtigt war - Ziehen nicht drücken.

7

Ich kann keinen Kommentar hinzufügen, da ich mich gerade angemeldet habe, aber das von Hirvox veröffentlichte und als Antwort ausgewählte Beispiel hat einen Fehler. Es sollte die new-Anweisung nicht verwenden, wenn die statische Methode Create verwendet wird.

Aktuell:

using (var reader = new XmlReader.Create(strUrl)) 

Korrigiert:

using (var reader = XmlReader.Create(strUrl)) 
+0

Danke, das habe ich behoben! –