2011-03-30 46 views
0

我們正在使用XML文件來保存我們的數據都是雙倍的。由於我們的數據非常龐大,因此在GB的範圍內,我們將其轉換爲字節以節省磁盤空間和訪問時間。此外,我們正在將數據寫入幾MB的數據塊中,並且新數據塊也可能來自與之前數據源相同的數據源,或者來自不同數據源。對於每個新源,我們都在XML文件中創建了一個元素,以便將來很容易地識別來自該源的數據。 我們面臨的問題是,如何識別與XML文件中的源對應的元素,然後將對應於該源的數據附加到已經在XML文件中捕獲的數據。我正在使用Linq XML,並無法谷歌任何解決方案使用此方法。我嘗試了XMLWriter類,但是使用它的問題是如何識別或訪問我想寫塊的元素。如何將二進制數據附加到XML文件中特定位置的特定節點

+0

究竟你的「將其轉換爲字節」是什麼意思?這就是每個流都會做的。 – 2011-03-30 18:06:05

回答

1

對於編寫大量二進制數據(由於需要將二進制數據存儲爲Base64字符串或其他字符安全編碼)而言,XML並不是一種好的格式,也不適用於在大型數據庫中更新數據塊文件。我建議重新考慮你的文件格式。

如果你必須去與XML:

  • 確保您的字節數組時,寫入XML
  • 你必須複製XML時要在中間插入數據base64編碼。考慮使用XmlReader和XmlWriter。將源XML複製到要添加數據的位置,將數據添加到輸出寫入器,然後完成複製剩餘部分的XML。
  • 避免在內存中加載整個XML,因爲它會導致您的GB數據範圍出現問題。
0

我確定我沒有這裏的全貌,但很難理解你爲什麼不使用數據庫。儘管如此,跟進阿列克謝的帖子,這裏是你如何使用的XmlReader和XmlWriter的來完成我覺得你想要做一個人爲的例子:

//start with some dummy data 
string bigData = "<bigdata><rec id='1'>1234</rec><rec id='2'>2468</rec></bigdata>"; 
string criterion = "2"; 
string append = "10"; 
string newValue = ""; 
bool match = false; 
StringBuilder sb = new StringBuilder(); 
using (XmlWriter writer = XmlWriter.Create(sb)) 
{ 
    using (XmlReader reader = XmlReader.Create(new StringReader(bigData))) 
    { 
    while (reader.Read()) 
    { 
    switch (reader.NodeType) 
    { 
    case XmlNodeType.Element: 
     if (reader.LocalName == "rec") 
     { 
      match = reader.GetAttribute("id").ToString() == criterion; 
     } 
     writer.WriteStartElement(reader.LocalName); 
     writer.WriteAttributes(reader, true); 
     if (reader.IsEmptyElement) 
     { 
      writer.WriteEndElement(); 
     } 
     break; 
    case XmlNodeType.Text: // do the append here 
     newValue = match ? reader.Value + append : reader.Value; 
     writer.WriteString(newValue); 
     break; 
    //other cases based on node types 
    case XmlNodeType.EndElement: 
     writer.WriteFullEndElement(); 
     break; 
    }                  
    } 
     writer.Flush(); 
     string x = sb.ToString();//output 
    }       
}