我們正在使用XML文件來保存我們的數據都是雙倍的。由於我們的數據非常龐大,因此在GB的範圍內,我們將其轉換爲字節以節省磁盤空間和訪問時間。此外,我們正在將數據寫入幾MB的數據塊中,並且新數據塊也可能來自與之前數據源相同的數據源,或者來自不同數據源。對於每個新源,我們都在XML文件中創建了一個元素,以便將來很容易地識別來自該源的數據。 我們面臨的問題是,如何識別與XML文件中的源對應的元素,然後將對應於該源的數據附加到已經在XML文件中捕獲的數據。我正在使用Linq XML,並無法谷歌任何解決方案使用此方法。我嘗試了XMLWriter類,但是使用它的問題是如何識別或訪問我想寫塊的元素。如何將二進制數據附加到XML文件中特定位置的特定節點
0
A
回答
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
}
}
究竟你的「將其轉換爲字節」是什麼意思?這就是每個流都會做的。 – 2011-03-30 18:06:05