Frage

Wie können Sie einen Streaming-Lesevorgang für eine große XML-Datei durchführen, die direkt unter dem Stammelement eine xs:sequence enthält, ohne die gesamte Datei in eine XDocument-Instanz im Speicher zu laden?

War es hilfreich?

Lösung

Gehen Sie mit einem Elementparser im SAX-Stil und dem XmlTextReader Klasse erstellt mit XmlReader.Create wäre eine gute Idee, ja.Hier ist ein leicht modifiziertes Codebeispiel von 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);
      }
    }
  }
}

Andere Tipps

Ich kann keinen Kommentar hinzufügen, da ich mich gerade erst angemeldet habe, aber das von Hirvox gepostete und derzeit als Antwort ausgewählte Codebeispiel enthält einen Fehler.Das sollte es nicht haben new Anweisung bei Verwendung der Statik Create Methode.

Aktuell:

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

Fest:

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

Ich denke, es ist nicht möglich, wenn Sie ein Objektmodell verwenden möchten (d. h.XElement\XDocument), um XML abzufragen.Offensichtlich können Sie keinen XML-Objektbaum erstellen, ohne genügend Daten zu lesen.Sie können es jedoch verwenden XmlReader Klasse.

Die XMLReader -Klasse liest XML -Daten aus einem Stream oder einer Datei.Es bietet nicht schneidende, nur vorwärts und schreibgeschützte Zugriff auf XML-Daten.

Hier ist eine Anleitung: http://support.microsoft.com/kb/301228/en-us Denken Sie daran, dass Sie nicht XmlTextReader, sondern XmlReader in Verbindung mit XmlReader.Create verwenden sollten

Die Erwähnung von „xs:sequence“ verwirrt mich – dies ist ein XML-Schema-Element.

Versuchen Sie, eine große XML-Schemadatei 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 bei der Verwendung des Standard-XmlReader (oder XmlValidatingReader) zu Problemen führen.

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

In diesem Codebeispiel wird versucht, Code im XmlReader-Stil in Code im SAX-Stil umzuwandeln. Wenn Sie Code von Grund auf schreiben, würde ich XmlReader einfach so verwenden, wie es beabsichtigt war – Pull, nicht Push.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top