Если я делаю
XPathDocument doc = new XPathDocument("filename.xml");
Это загружает весь документ в память? Я пишу приложение для мобильного телефона, и документ мог бы хранить много данных, которому никогда не нужно ко всем быть загруженным одновременно. Мобильные телефоны обычно не имеют слишком большого количества поршня!
Да, весь XML-документ представлен в памяти .
Одно из решений - разбить большой XML-документ на множество более мелких.
Или, в качестве альтернативы, вы можете написать свой собственный XmlReader
, который будет игнорировать нежелательные поддеревья. Вы можете передать этот XmlReader
в качестве аргумента конструктору XpathDocument ()
- необходимо замаскировать его как TextReader
.
https://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathdocument.aspx
"Обеспечивает быстрое , доступное только для чтения представление XML-документа в памяти с использованием модели данных XPath. "
Вы, вероятно, захотите что-то более похожее на System.Xml.XmlReader .
Возможно, вы захотите посмотреть XStreamingElement LINQ to XML:
Представляет элементы в дереве XML, которое поддерживает отложенный потоковый вывод.
Этот класс позволяет вам создать дерево XML , которое поддерживает отложенный потоковый вывод. Вы используете этот класс для создания XML-дерева очень похожим образом на создание XML-дерева с помощью XElement. Однако есть принципиальная разница. Когда вы используете запрос LINQ для указания содержимого при создании XML-дерева с помощью XElement, переменная запроса повторяется во время создания XML tree, и результаты запроса добавляются в XML-дерево. Напротив, когда вы создаете дерево XML с помощью XStreamingElement, ссылка на переменную запроса сохраняется в дереве XML без итерации. Запросы повторяются только после сериализации. Это позволяет создавать деревья XML большего размера, сохраняя при этом меньший объем памяти .
При потоковой передаче из источника ввода, такого как текстовый файл, вы можете читать очень большой текстовый файл и генерировать очень большой XML-документ. при сохранении небольшого объема памяти .
Вы можете попробовать другой конструктор XPathDocument (stream) . Потоковая передача документа не займет много памяти.
Возможно, вам не стоит обращать внимание на Linq to XML , так как это проще и быстрее кодировать и делать более красивый код, чем использовать синтаксический анализ SAX / DOM. См. Это сообщение: Как хранить данные без использования базы данных и как их получать?