У меня есть требования по загрузке больших XML-файлов (от 0,5 МБ до 600 МБ), расшифровке данных, которые находятся в файле XML, и напишите, что к MemoryStream.Как передать (загрузить) XML-файл, изменить данные XML-элемента и записать в MemoryStream
Важно, чтобы дешифрованные данные не опирались на диск.
Ниже представлена моя текущая реализация, которая загружает весь XML-документ в память, расшифровывает номер карты и устанавливает значение, а затем копирует измененный XML-документ в MemoryStream
. Однако эта реализация не представляется возможной, поскольку она загружает весь XML-документ в ОЗУ.
public MemoryStream DecryptFile(string xmlFullPath, DateTime encryptionKey)
{
XNamespace xmlNameSpace = "http://www.xml.com/schema";
XDocument fileXDocument = XDocument.Load(xmlFullPath);
IEnumerable<XElement> cardElements =
fileXDocument
.Descendants(xmlNameSpace + "card");
// Iterate over each <card> element within the <batchRequest>.
foreach (XElement cardElement in cardElements)
{
XElement cardNumberElement = cardElement.Element(xmlNameSpace + "number");
// Read encrypted value
// Decrypt value
cardNumberElement.SetValue(decryptedCreditCard);
}
// Save the XML document, with the decrypted cards, to a memory stream.
var memoryStream = new MemoryStream();
fileXDocument.Save(memoryStream, SaveOptions.DisableFormatting);
// Rewind the stream, so that it's ready to be read from it elsewhere.
memoryStream.Position = 0;
return memoryStream;
}
Я довольно хорошо знаком с XmlReader
, и я использую его для других операций.
Я думал о возможности запуска XML-документа и просто выписывать элемент за элементом в соответствующий MemoryStream и в конечном итоге расшифровывать данные и записывать их в поток памяти по мере появления номеров карт.
Однако я не могу получить необработанный XML элемента start/end, который я выполняю. По крайней мере, без разбора/загрузки всего элемента, который разрешает операция, например ReadOuterXml. Но я не хочу читать весь элемент. Я просто хочу написать исходный элемент-элемент в MemoryStream и обрабатывать только дешифрование номера карты, когда я сталкиваюсь с ними.
Обратите внимание, что номер карты находится в сериализованном объекте «транзакция». то есть <transaction>...<number>asdfa3423jasfa</number></transaction>
Итак, как я могу загрузить (передать) XML-файл, изменить биты данных в нем и постепенно записывать содержимое в MemoryStream?
Для этого вам необходимо использовать потоковый XML API. Попробуйте XmlTextReader. Кроме того, вы знаете, что MemoryStream также все в памяти сразу, не так ли? – hoodaticus
@hoodaticus yea в отношении MemoryStream, наше тестовое шоу, в котором прямое хранение MemoryStream в ОЗУ не является _as bad_, как загрузка всего XML в ОЗУ. Лестница вызывает исключения из-за памяти, тогда как MemoryStream в порядке и в наших ограничениях. – contactmatt
не забудьте мое предложение XmlTextReader. Я использовал его для создания полностью потоковых сервисов - очень быстрое и маленькое использование плоской памяти было очень хорошим. – hoodaticus