2009-02-10 108 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>