2009-02-10 10 views
1

J'ai un objet stream, et je veux créer et sortir un fichier XML en utilisant un flux XML, en fonction des données de mon flux d'entrée. Je n'ai pas beaucoup travaillé avec les cours d'eau, alors j'essaie d'apprendre à le faire aussi efficacement que possible. L'idée est que je ne veux pas charger tout le flux d'entrée en mémoire, puis créer le flux de sortie entier en mémoire parce qu'à un certain point, vous obtenez au moins le double de la taille du flux d'entrée occupant de la mémoire.Aide sur les flux (.net)

Il doit y avoir des moyens de sorte que lorsque les données sont lues dans le flux d'entrée, le flux xml est construit et les données lues dans le flux d'entrée sont ignorées. De plus, je voudrais l'architecturer de sorte que le flux xml ne soit pas construit complètement puis transmis, mais que le flux xml puisse être lu lors de sa construction. Quelqu'un a-t-il des exemples de code ou de bonnes ressources pour en savoir plus?

Répondre

1

Pour écrire votre XML comme un flux, utilisez XmlTextWriter.

Vous pouvez lui donner un flux à écrire. Cela vous donnera ce que vous voulez (sortie de flux) et vous donner beaucoup de flexibilité. En passant le flux à utiliser dans votre code en tant qu'argument, vous pouvez connecter un flux de mémoire, un flux de fichier ou à peu près tout sans que le code de mise en forme XML ait besoin de le savoir. Le XmlTextWriter videra périodiquement les données (de sorte qu'il ne restera pas à moins que rien ne le lise du flux), rappelez-vous juste de faire un dernier vidage/fermeture à la fin.

Les flux sont également la façon dont vous allez gérer les entrées. Au fur et à mesure que vous traitez cette entrée et que vous décidez des éléments XML à écrire, utilisez XmlTextWriter pour les écrire et il se chargera de transmettre ces données à ceux qui les liront. Donc vous vous retrouvez avec une boucle (ou des boucles) qui lit un peu, en faisant un peu de traitement, puis en écrivant dans le XmlTextWriter en même temps.

+0

Existe-t-il un flux en avant uniquement disponible que je puisse utiliser? Le flux de mémoire est disponible, donc il continuera à remplir la mémoire même si je l'ai lu. Y at-il quelque chose qui va supprimer les données du flux que je lis? – Jeremy

+0

Vous pouvez écrire dans un fichier avec FileStream et FileMode.Append et FileAccess.Write. Ou peut-être que System.IO.Pipes.PipeStream (.NET 3.5) fonctionnera pour vous. Je n'ai pas utilisé de pipes .NET auparavant, donc je ne peux pas vous le dire par expérience. Mais j'ai utilisé des flux Java. – JasonMArcher

2

XmlTextReader est utilisé si vous avez besoin pour accéder au XML en tant que données brutes, sans les frais généraux d'une mémoire Document Object Model (DOM)

XmlTextReader fournit un mécanisme plus rapide lecture des données XML. Le code suivant charge XmlTextReader à partir d'un flux.

using (XmlTextReader reader= new XmlTextReader (stream)) { 

while (reader.Read()) 
{ 
    switch (reader.NodeType) 
    { 
     case XmlNodeType.Element: // The node is an Element. 
      Console.Write("<" + reader.Name); 
    Console.WriteLine(">"); 
      break; 
    case XmlNodeType.Text: //Display the text in each element. 
      Console.WriteLine (reader.Value); 
      break; 
    case XmlNodeType. EndElement: //Display end of element. 
      Console.Write("</" + reader.Name); 
    Console.WriteLine(">"); 
      break; 
    } 
} 


} 
+0

Je ne suis pas sûr que le flux d'entrée est xml Ressemble plus il est d'autres données converties en XML –

+0

@Joel, oui, il est d'un flux tcp, qui obtient analysé et xml construit basé sur.. ces données – Jeremy

0

Vous pouvez utiliser la méthode XmlReader.Create pour créer une instance de XmlReaderObject. Utilisez XmlReaderSettings pour spécifier les paramètres XML (XSD, ignoreComments, etc.)

 XmlReaderSettings settings = new XmlReaderSettings(){ 
     settings.IgnoreComments = true; 
     using (XmlReader reader = XmlReader.Create("Test.xml",settings)){ 
      while(reader.Read()){ 

       // Construct/Evaluate XML Here.... 
      } 
      reader.Close(); 
     } 
    } 
0

Si vous utilisez .net 3.5, vous pouvez utiliser XLINQ. Ceci est l'exemple de http://blogs.msdn.com/wriju/archive/2007/02/20/xlinq-create-xml-from-object-using-linq.aspx

Si vous faites un google sur "xlinq create" Vous trouverez de nombreux exemples (vous seriez probablement plus intéressé par les exemples de RSS, je pense.

sortie
var objCust = new[] 
{ 
new {CustID = 2, CustName = "Sumitra", Phone = "123-123-1236"}, 
new {CustID = 3, CustName = "Wriju", Phone = "123-123-1235"}, 
new {CustID = 4, CustName = "Writam", Phone = "123-123-1234"}, 
new {CustID = 1, CustName = "Debajyoti", Phone = "123-123-1237"} 
}; 
XElement _customers = new XElement("customers", 
         from c in objCust 
         orderby c.CustID //descending 
         select new XElement("customer", 
          new XElement("name", c.CustName), 
          new XAttribute("ID", c.CustID), 
          new XElement("phone", c.Phone) 
              ) 
            ); 
Console.WriteLine(_customers); 

ressemblera à ceci :.

<customers> 
    <customer ID="1"> 
    <name>Debajyoti</name> 
    <phone>123-123-1237</phone> 
    </customer> 
    <customer ID="2"> 
    <name>Sumitra</name> 
    <phone>123-123-1236</phone> 
    </customer> 
    <customer ID="3"> 
    <name>Wriju</name> 
    <phone>123-123-1235</phone> 
    </customer> 
    <customer ID="4"> 
    <name>Writam</name> 
    <phone>123-123-1234</phone> 
    </customer> 
</customers>