Domanda

Ho un oggetto flusso, e voglio creare e output XML utilizzando qualche tipo di flusso XML, in base ai dati del mio flusso di input. Non ho fatto molto lavoro con i flussi, in modo da sto cercando di imparare come fare questo nel modo più efficiente possibile. L'idea è che io non voglio caricare l'intero flusso di input in memoria, quindi creare l'intero flusso di output in memoria perché ad un certo punto si finisce con almeno il doppio della dimensione del flusso di ingresso occupare memoria.

Ci devono essere modi in modo che quando i dati vengono letti nel flusso di input, il flusso XML è costruito e i dati letti dal flusso di input viene scartato. Inoltre, vorrei architetto in modo che il flusso XML non è costruita completamente quindi passata fuori, ma invece il flusso XML può essere letta in quanto è in fase di costruzione. Qualcuno ha alcuni esempi di codice, o buone risorse per l'apprendimento di questo?

È stato utile?

Soluzione

Per la scrittura del XML come un corso d'acqua, utilizzare XmlTextWriter .

Si può dare un flusso di scrivere. Questo vi darà ciò che si vuole (output stream) e si dà un sacco di flessibilità. Facendo passare la corrente da utilizzare per il codice come un argomento, è possibile collegare un flusso di memoria, o un flusso di file o qualsiasi cosa senza il codice di formattazione XML bisogno di sapere. Il XmlTextWriter periodicamente svuotare i dati (quindi non ci vorrà attaccare intorno a meno che non lo legge dal flusso), basta ricordarsi di fare un colore finale / vicino alla fine.

Streams sono anche come si intende gestire l'input. Come si elabora l'input e può decidere su quali elementi XML per scrivere, usare il XmlTextWriter di scriverle e si prenderà cura di streaming che dati fuori a chi sarà la lettura di esso. Così si finisce con un ciclo (o loop), che sta leggendo un po ', fare un po' di elaborazione, quindi scrivendo al XmlTextWriter tutto in una volta.

Altri suggerimenti

XmlTextReader viene utilizzata se è necessario accedere al XML come dati non elaborati senza il sovraccarico di un documento in memoria Object Model (DOM)

XmlTextReader fornisce un meccanismo più veloce per la lettura di XML. Il seguente codice carica XmlTextReader da un flusso.

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;
    }
}


}

È possibile utilizzare il metodo XmlReader.Create per creare un'istanza di un oggetto XmlReader. Utilizzare XmlReaderSettings per specificare impostazioni XSD (XML, ignorare i commenti, ecc.)

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

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

Se si utilizza .NET 3.5, è possibile utilizzare XLINQ. Questo è l'esempio da http://blogs.msdn.com/wriju/archive/2007/02/20/xlinq-create-xml-from-object-using-linq.aspx

Se fate un google su "xlinq creare " troverete molti esempi (si sarebbe probabilmente più interessati negli esempi RSS, sto pensando.

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);

uscita sarà simile a questa:

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top