2016-03-08 46 views
0

我有一些返回xml文件的過程。XmlReader,XmlWriter - 使用流的concat xmlFiles

是否有可能連接許多XML文件只使用流?

是這樣的:

 XmlWriter writer = XmlWriter.Create(sb,settings) 
    { 

      foreach(var cmd in XmlFiles) 
      { 
      using (XmlReader r = cmd.ExecuteXmlReader()) 
      { 
        while (r.Read()) 
        { 
         string xml = r.ReadOuterXml(); 
         writer.WriteRaw(xml); 
        } 
       } 
      } 

    } 

我需要做到這一點,而不使用字符串,因爲我要處理大文件。

+2

您不能只連接兩個XML文件來生成一個新的XML文件,因爲這樣做會違反某些要求(例如只有一個根元素)。例如。你試圖製作的*不是* XML(儘管表面上有些相似),所以你不應該期望XML工具能夠生成它。 –

+0

於是爲Concat的這樣 ...沒有簡單的方法...... 得到 \t ... ...... 使用流? – adamo94

回答

2

如果你不想使用字符串,那麼你爲什麼使用ReadOuterXmlWriteRaw?有一種方法WriteNode消耗了通過的XmlReader,因此例如

 string[] inputFiles = { "XMLFile1.xml", "XMLFile2.xml" }; 

     using (XmlWriter xw = XmlWriter.Create("result.xml")) 
     { 
      xw.WriteStartDocument(); 
      xw.WriteStartElement("root"); 
      foreach (string inputFile in inputFiles) 
      { 
       using (XmlReader xr = XmlReader.Create(inputFile)) 
       { 
        xr.MoveToContent(); 
        xw.WriteNode(xr, true); 
       } 
      } 
      xw.WriteEndElement(); 
      xw.WriteEndDocument(); 

將創建一個root元素包裹的兩個XML文件的內容,新的XML文檔。

在你的代碼可以使用,因此

 foreach(var cmd in XmlFiles) 
     { 
     using (XmlReader r = cmd.ExecuteXmlReader()) 
     { 
       r.MoveToContent(); 
       writer.WriteNode(r, false); 
      } 
     } 

只要你確保你輸出根元素包裝(或您使用與XmlWriterSettings和ConformanceLevel.Fragment一個的XmlWriter)。

+0

謝謝,這就是我一直在尋找的東西。 – adamo94