2009-02-10 118 views
1

我有一个流对象,我想根据输入流中的数据使用某种xml流创建和输出xml。我还没有做过很多有关流的工作,所以我正在努力学习如何尽可能有效地做到这一点。我的想法是,我不想将整个输入流加载到内存中,然后在内存中创建整个输出流,因为在某些时候,输入流的大小至少会占用内存的两倍。流帮助(.net)

必须有这样的方法,以便在输入流中读取数据时,构建xml流,并丢弃从输入流读取的数据。另外,我想构建它,以便xml流不会完全构建,然后传递出去,而是可以在构建xml流时读取它。有没有人有一些代码示例,或有用于了解这一点的好资源?如果需要访问XML作为原始数据,而不的开销中存储器文档对象模型(DOM)

XmlTextReader的提供了一种用于读取XML更快机构

回答

1

对于出编写XML作为流,使用XmlTextWriter

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

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

2

使用XmlTextReader。以下代码从流中加载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; 
    } 
} 


} 
+0

我不知道该输入流是XML听起来更像是它的其他数据被转换为XML – 2009-02-10 04:53:10

+0

@Joel,是的,它是从一个TCP流,它被解析,并根据建立的XML。那数据。 – Jeremy 2009-02-11 23:29:35

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