Поиск определенных атрибутов в большом документе XML - PullRequest
2 голосов
/ 15 декабря 2010

У меня большой XML-документ размером около 100 МБ. Мне нужно найти атрибуты для двух тегов в этом документе. Я могу сделать это, используя код, подобный следующему:

XmlDocument xmlDocument = new XmlDocument ( );
xmlDocument.Load ( "C:\\myxml.xml" );

XmlNode node1 = xmlDocument.SelectSingleNode ( "/data/objects[@type='data type 1']" );
if ( null != node1 )
{
   result = node1 [ "Version" ].Value;
}

Но при этом весь XML-файл загружается в память, которая, кажется, занимает около 200 МБ. Могу ли я сделать это более эффективным?

Редактировать: множество хороших ответов с использованием XmlTextReader, который я написал для использования сейчас. (Это будет более эффективным с точки зрения памяти, но безобразно:).

Ответы [ 3 ]

4 голосов
/ 15 декабря 2010

По производительности SAX намного лучше, чем DOM, так как на самом деле вам нужно только одно значение. SAX-реализация в .NET Framework - XmlTextReader .

3 голосов
/ 15 декабря 2010

Вы должны попытаться использовать XmlReader.

С MSDN :

Как и SAX-ридер, XmlReader - это курсор только для чтения вперед и только для чтения.Он обеспечивает быстрый, не кэшированный поток доступа к входу.Он может читать поток или документ.Это позволяет пользователю извлекать данные и пропускать записи, которые не представляют интереса для приложения.Большая разница заключается в том, что модель SAX представляет собой модель «push», где анализатор отправляет события в приложение, уведомляя приложение каждый раз, когда читается новый узел, в то время как приложения, использующие XmlReader, могут извлекать узлы из считывателя побудет.

Пример здесь .

1 голос
/ 15 декабря 2010

Вы можете использовать класс XmlReader для этого. Простой, но рабочий пример, который делает то же самое, что и код выше, выглядит следующим образом:

string result = null;

using (var reader = XmlReader.Create(@"c:\\myxml.xml"))
{
    while (reader.Read())
    {
        if (reader.NodeType == XmlNodeType.Element
            && reader.Depth == 1
            && reader.LocalName == "objects"
            && reader.GetAttribute("type") == "data type 1")
        {
            result = reader.GetAttribute("Version");
            break;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...