Question

Comment pouvez-vous faire un streaming lire sur un gros fichier XML qui contient un xs:sequence juste en dessous de l'élément racine, sans charger tout le fichier dans un XDocument instance en mémoire?

Était-ce utile?

La solution

Aller avec un SAX-élément de style et l'analyseur de la XmlTextReader classe créée avec XmlReader.Créer ce serait une bonne idée, oui.Voici un peu modifié le code d'exemple de 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);
      }
    }
  }
}

Autres conseils

Je ne peux pas ajouter un commentaire, car je viens de m'inscrire, mais l'exemple de code posté par Hirvox et actuellement sélectionné comme la réponse a un bug.Elle ne devrait pas avoir new déclaration lors de l'utilisation de la statique Create la méthode.

Courant:

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

Fixe:

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

Je pense qu'il n'est pas possible si vous souhaitez utiliser le modèle d'objet (c'est à direXElement\XDocument) pour la requête XML.Évidemment, vous ne pouvez pas créer des objets XML arbre sans la lecture de suffisamment de données.Cependant, vous pouvez utiliser XmlReader classe.

La classe XmlReader lit de données XML à partir d'un flux ou d'un fichier.Il fournit non mis en cache, avant uniquement en lecture seule l'accès aux données XML.

Heres est un howto: http://support.microsoft.com/kb/301228/en-us Rappelez-vous juste que vous ne devriez pas utiliser XmlTextReader mais au lieu XmlReader en conjonction avec XmlReader.Créer

Je suis confus par la mention de la "xs:sequence" - c'est un élément de Schéma XML.

Vous tentez d'ouvrir un gros fichier de Schéma XML?Êtes-vous ouvert un gros fichier XML qui est basé sur ce schéma?Ou vous essayez d'ouvrir un gros fichier XML et de les valider en même temps?

Aucune de ces situations ne devraient vous fournir avec un problème à l'aide de la norme XmlReader (ou XmlValidatingReader).

Lire le XML avec XMLReader: http://msdn.microsoft.com/en-us/library/9d83k261(SV.80).aspx

Que l'exemple de code tente de transformer XmlReader code de style en SAX code de style - si vous écrivez du code à partir de zéro, je venais d'utiliser XmlReader comme il était prévu Pull pas Pousser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top