Pergunta

Eu tenho um objeto de fluxo, e eu quero criar e xml saída usando algum tipo de fluxo de XML, com base em dados no meu fluxo de entrada. Eu não tenho feito muito trabalho com fluxos, então eu estou tentando aprender como fazer isso da forma mais eficiente possível. A idéia é que eu não quero para carregar todo o fluxo de entrada na memória, em seguida, criar todo o fluxo de saída na memória porque em algum momento você acabar com pelo menos o dobro do tamanho do fluxo de entrada ocupando memória.

Deve haver maneiras para que, como os dados são lidos no fluxo de entrada, o fluxo de XML é construído e ler os dados do fluxo de entrada é descartado. Além disso, eu gostaria de arquiteto-lo de modo que o fluxo de XML não é construído completamente em seguida, passou para fora, mas em vez disso o fluxo de XML pode ser lido como ele está sendo construído. Alguém tem alguns exemplos de código, ou bons recursos para aprender sobre isso?

Foi útil?

Solução

Para escrever seu XML como um fluxo, use XmlTextWriter .

Você pode dar-lhe um fluxo para gravar. Isto lhe dará o que você quer (saída stream) e dar-lhe muita flexibilidade. Ao passar o fluxo para uso em seu código como um argumento, você pode ligar um fluxo de memória, ou um fluxo de arquivo ou apenas sobre qualquer coisa sem o código de formatação XML a necessidade de saber. O XmlTextWriter vai lavar periodicamente os dados (para que ele não vai ficar por menos que nada lê-lo a partir do fluxo), lembre-se de fazer um flush final / próximo ao final.

Streams também como você vai lidar entrada. Como você processar essa entrada e pode decidir sobre elementos que XML para escrever, use o XmlTextWriter para escrevê-los e ele vai cuidar de streaming de que os dados fora a quem será lê-lo. Então você acaba com um loop (ou ciclos), que está a ler um pouco, fazer algum processamento, em seguida, escrever para o XmlTextWriter tudo de uma vez.

Outras dicas

XmlTextReader é usado se você precisar acessar o XML como dados não processados ??sem a sobrecarga de um em objeto de memória documento Model (DOM)

XmlTextReader fornece um mecanismo mais rápido para ler XML. O seguinte código carrega XmlTextReader de um córrego.

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


}

Você pode usar o método XmlReader.Create para criar uma instância de um objeto XmlReader. Use XmlReaderSettings para especificar as configurações XML (XSD, ignorar os comentários, 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();
        }
    }

Se você estiver usando .net 3.5, Você poderia usar XLinq. Este é o exemplo de http://blogs.msdn.com/wriju/archive/2007/02/20/xlinq-create-xml-from-object-using-linq.aspx

Se você fizer um google em "XLinq criar " você vai encontrar muitos exemplos (você provavelmente seria mais interessados ??nos exemplos RSS, estou 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);

output será parecido com este:

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top