Domanda

Come è possibile eseguire una lettura in streaming su un file XML di grandi dimensioni che contiene un xs:sequence appena sotto l'elemento root, senza caricare l'intero file in un'istanza XDocument in memoria?

È stato utile?

Soluzione

Utilizzando un parser di elementi in stile SAX e il file XmlTextReader classe creata con XmlReader.Create sarebbe una buona idea, sì.Ecco un esempio di codice leggermente modificato da 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);
      }
    }
  }
}

Altri suggerimenti

Non posso aggiungere un commento, poiché mi sono appena iscritto ma l'esempio di codice pubblicato da Hirvox e attualmente selezionato come risposta contiene un bug.Non dovrebbe avere il new istruzione quando si utilizza l'istruzione static Create metodo.

Attuale:

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

Fisso:

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

Penso che non sia possibile se si desidera utilizzare il modello a oggetti (ad es.XElement\XDocument) per eseguire query su XML.Ovviamente, non è possibile creare un albero di oggetti XML senza leggere abbastanza dati.Comunque puoi usare XmlReader classe.

La classe XMLReader legge i dati XML da un flusso o un file.Fornisce un accesso non cache, solo in avanti e di sola lettura ai dati XML.

Ecco una guida: http://support.microsoft.com/kb/301228/en-us Ricorda solo che non dovresti usare XmlTextReader ma invece XmlReader insieme a XmlReader.Create

Sono confuso dalla menzione di "xs:sequence": questo è un elemento dello schema XML.

Stai tentando di aprire un file XML Schema di grandi dimensioni?Stai aprendo un file XML di grandi dimensioni basato su quello schema?Oppure stai tentando di aprire un file XML di grandi dimensioni e di convalidarlo allo stesso tempo?

Nessuna di queste situazioni dovrebbe causare problemi utilizzando XmlReader standard (o XmlValidatingReader).

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

Questo esempio di codice tenta di trasformare il codice in stile XmlReader in codice in stile SAX: se stai scrivendo codice da zero, utilizzerei semplicemente XmlReader come previsto: Pull, non Push.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top