帮助流(.net)

时间:2009-02-10 04:13:21

标签: c# .net streaming stream iostream

我有一个流对象,我想根据输入流中的数据使用某种xml流创建和输出xml。我没有做过很多关于流的工作,所以我试图尽可能高效地学习如何做到这一点。我的想法是我不想在内存中加载整个输入流,然后在内存中创建整个输出流,因为在某些时候你最终会占用占用内存的输入流的两倍。

必须有一些方法,以便在输入流中读取数据时,构建xml流并丢弃从输入流中读取的数据。另外,我想构建它以便xml流不是完全构建然后传递出去,而是可以在构建时读取xml流。有没有人有一些代码样本,或者有很好的资源来学习这个?

4 个答案:

答案 0 :(得分:2)

如果您需要以原始数据的形式访问XML而不需要内存文档对象模型(DOM)的开销,则使用XmlTextReader

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 :(得分:1)

要将XML作为流编写,请使用XmlTextWriter

你可以给它写一个流来写。这将为您提供您想要的(流输出)并为您提供很大的灵活性。通过将流作为参数传递给您的代码,您可以连接内存流,或文件流或几乎任何东西,而无需XML格式代码需要知道。 XmlTextWriter会定期刷新数据(所以除非没有从流中读取数据,否则它不会粘在一起),只记得在最后进行最后的刷新/关闭。

Streams也是你处理输入的方式。当您处理该输入并且可以决定要写入哪些XML元素时,使用XmlTextWriter来编写它们,它将负责将数据流式传输给任何将要读取它的人。所以你最终得到一个循环(或循环),读取一点,做一些处理,然后一次写入XmlTextWriter。

答案 2 :(得分:0)

您可以使用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();
        }
    }

答案 3 :(得分:0)

如果您使用的是.net 3.5,则可以使用XLINQ。这是http://blogs.msdn.com/wriju/archive/2007/02/20/xlinq-create-xml-from-object-using-linq.aspx

的示例

如果你在"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>