Помогите с потоками (.net) - PullRequest
       12

Помогите с потоками (.net)

1 голос
/ 10 февраля 2009

У меня есть объект потока, и я хочу создать и вывести xml, используя некоторый поток xml, основываясь на данных в моем входном потоке. Я не очень много работал с потоками, поэтому я пытаюсь научиться делать это максимально эффективно. Идея состоит в том, что я не хочу загружать весь входной поток в память, а затем создавать весь выходной поток в памяти, потому что в какой-то момент вы в конечном итоге удваиваете размер входного потока, занимая память.

Должны быть способы, чтобы при считывании данных во входном потоке поток xml создавался, а данные, считанные из входного потока, отбрасывались. Кроме того, я хотел бы спроектировать его так, чтобы поток xml не был полностью построен, а затем потерян, но вместо этого поток xml можно прочитать по мере его создания. У кого-нибудь есть примеры кода или хорошие ресурсы для изучения этого?

Ответы [ 4 ]

2 голосов
/ 10 февраля 2009

XmlTextReader используется, если вам нужен доступ к XML в виде необработанных данных без дополнительной нагрузки на объектную модель документа (DOM) в памяти.

XmlTextReader обеспечивает более быстрый механизм чтения XML. Следующий код загружает XmlTextReader из потока.

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


}
1 голос
/ 10 февраля 2009

Для записи XML в виде потока используйте XmlTextWriter .

Вы можете указать поток для записи. Это даст вам то, что вы хотите (потоковый вывод) и даст вам большую гибкость. Передав поток для использования в свой код в качестве аргумента, вы можете подключить поток памяти или поток файлов или что-нибудь еще без необходимости знать код форматирования XML. XmlTextWriter будет периодически сбрасывать данные (поэтому он не будет задерживаться, пока ничего не прочитает его из потока), просто не забудьте сделать окончательный сброс / закрытие в конце.

Потоки также, как вы будете обрабатывать ввод. Когда вы обрабатываете эти входные данные и можете решить, какие XML-элементы записать, используйте XmlTextWriter для их записи, и он позаботится о том, чтобы эти данные передавались тому, кто их будет читать. Таким образом, в результате получается цикл (или циклы), который немного читает, выполняет некоторую обработку, а затем записывает все сразу в XmlTextWriter.

0 голосов
/ 10 февраля 2009

Если вы используете .net 3.5, вы можете использовать XLINQ. Это пример из http://blogs.msdn.com/wriju/archive/2007/02/20/xlinq-create-xml-from-object-using-linq.aspx

Если вы выполните Google на "xlinq create" Вы найдете много примеров (я думаю, вас больше всего интересуют примеры RSS, я думаю.

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

вывод будет выглядеть так:

<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>
0 голосов
/ 10 февраля 2009

Вы можете использовать метод XmlReader.Create, чтобы создать объект XmlReaderObject. Используйте XmlReaderSettings для указания настроек XML (XSD, IgnoreComments и т. Д.)

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

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