[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Web - программирование / XML /

Небольшой и быстродействующий синтаксический анализатор XML для традиционного C++

Несмотря на возрастающий успех .NET Framework, Майкрософт по-прежнему серьезно относится к развитию традиционного C++. Это доказывается представлением XmlLite, высокопроизводительного и потребляющего мало ресурсов средства чтения и записи XML, предназначенного для приложений, написанных на традиционном C++.
Управляемый код широко поддерживает XML посредством пространства имен System.Xml, а традиционные приложения на Visual Basic® и C++, основывающиеся на COM, имеют доступ к аналогичному набору функций из основных служб Microsoft® XML (MSXML). Однако они не предлагают таких привлекательных возможностей для разработчиков, использующих традиционный C++, которым требуется быстродействующий и гибкий синтаксический анализатор XML. Обратимся к XmlLite.
В этой статье будут рассмотрены возможности, предоставляемые XmlLite. Сначала, однако, чтобы заинтриговать, я дам краткий обзор того, что XmlLite не обеспечивает — по крайней мере, в этой первоначальной версии. Для начала, он не предоставляет ни реализации объектной модели документа (DOM — Document Object Model), ни схемы XML или проверки определения типа документа (DTD — Document Type Definition). В нем нет также поддержки функций высокого уровня, таких как переходы на основе указателя (например, XPath), таблиц стилей и сериализации. Однако, при необходимости все пробелы можно заполнить функциями, созданными на основе XmlLite тем же способом, которым созданы почти все функции XML в Microsoft .NET Framework на основе классов XmlReader и XmlWriter.
Так что же предлагает XmlLite? Если кратко, он предоставляет некэшированный, «только вперед» анализатор (предоставляет опрашивающую модель программирования) и некэшированный, «только вперед» генератор XML. Оба компонента оказались очень ценными инструментами.

Зачем нужен новый синтаксический анализатор XML?
Разработчики привыкают к тем библиотекам, которыми они пользуются ежедневно, и при широком использовании XML у них обязательно возникают вопросы относительно самого нового анализатора XML. Чтобы оценить значение этого нового анализатора, обсудим сначала сложившуюся к настоящему времени ситуацию с анализаторами XML.
Естественно, если приложение уже использует .NET Framework, обычно решение принять просто: использовать System.Xml. Аргументом в пользу этого решения является то, что модель XmlLite основана на классах XmlReader и XmlWriter среды .NET Framework. Использование XmlLite из управляемых приложений, написанных в среде C++, обычно не дает никаких преимуществ. В конце концов, функциональные возможности XmlLite гораздо скромнее, чем те, которые предоставляются классами XmlReader и XmlWriter. (В таблице на Рис. 1 показано, как основные типы в XmlLite соотносятся с типами .NET Framework.) Если, с другой стороны, приложение использует машинный код эксклюзивно, то традиционно выбирается MSXML, когда это касается технологии Майкрософт.

XmlLite .NET Framework
Интерфейс IXmlReader Класс XmlReader
Интерфейс IXmlWriter Класс XmlWriter
Перечисление XmlReaderProperty Класс XmlReaderSettings
Перечисление XmlWriterProperty Класс XmlWriterSettings
CreateXmlReaderInputWithEncodingCodePage
CreateXmlReaderInputWithEncodingName
CreateXmlWriterOutputWithEncodingCodePage
CreateXmlWriterOutputWithEncodingName
Класс Encoding
Перечисление XmlNodeType Перечисление XmlNodeType
MSXML предлагает два разных анализатора XML. Первый является реализацией DOM, существующей в разнообразных вариантах. Реализация DOM является разумным выбором при работе с относительно небольшими документами XML и необходимости произвольного доступа к документам XML для операций чтения и записи в памяти. Более поздние версии MSXML предоставляют реализацию простого интерфейса API для XML (SAX2). Насколько он в действительности «прост», является спорными моментом. При использовании SAX2, еще до начала воплощения идеи, вам потребуется реализовать по крайней мере два интерфейса COM — один, который получает уведомления о различные узлах в документе XML, и другой, получающий уведомления о синтаксических ошибках.
Причина добавления реализации SAX2 к MSXML заключалась в том, что, в отличие от реализации DOM, анализатор SAX2 читает документ XML в виде потока и выдает уведомления об узлах по мере их достижения. Это означает, что потребление памяти приложением не увеличивается с увеличением объема анализируемого документа.
Недостатком SAX2 и причиной, по которой .NET Framework не предоставляет для него реализации, является исходная сложность модели SAX2. Для этой модели необходима реализация интерфейсов или событий, и от разработчика требуются усилия по развертыванию более косвенной модели программирования, что приводит к необходимости управлять дополнительным состоянием и неизбежно усложняет приложение. Вместо этого классы XmlReader и XmlWriter в .NET Framework, так же, как интерфейсы IXmlReader и IXmlWriter анализатора XmlLite предоставляют простой синтаксический анализатор, который можно использовать непосредственно внутри функции без необходимости управлять каким-либо внешним состоянием или уведомлениями.
Благодаря простоте его модели, сообщения XmlLite обеспечивают значительно большую производительность, даже по сравнению с реализацией MSXML SAX2. Хотя анализатор SAX2 более удобен для обработки больших документов, чем реализация DOM, его достоинства меркнут при сравнении с XmlLite.
Говоря просто, XmlLite превосходит MSXML, и им гораздо легче пользоваться из традиционного C++. MSXML останется наиболее жизнеспособным решением для языков написания сценариев на основе Visual Basic и COM, но теперь, наконец-то, существует синтаксический анализатор, созданный специально для традиционного Visual C++®. Хотя XmlLite входит в комплект поставки Windows Vista™ и более поздних версий, существует также обновление для 32-разрядных и 64-разрядных версий Windows® XP и Windows Server® 2003. Поскольку регистрация COM не используется, этот пакет обновления не вызывает осложнений, сопровождающих установку и управление версиями MSXML.

«Облегченный» COM
XmlLite не просто броское название — он действительно является простым анализатором XML. XmlLite заимствует лучшие стороны COM, а именно дисциплину и правила программирования, и обходится без сложных и не всегда необходимых компонентов, таких как регистрация COM, службы этапа выполнения, прокси-серверы, потоковые модели и т.д.
Функции, экспортируемые из библиотеки XmlLite.dll, служат для создания инструментов чтения и записи XML. Доступ к ним можно получить, установив связь с библиотекой XmlLite.lib и включив заголовок файла XmlLite.h из Windows SDK. В полученных интерфейсах в стиле COM для управления циклом существования используются знакомые методы интерфейса IUnknown. Интерфейсу COM IStream тоже выполняет свою роль и представляет память. За исключением этого от COM больше ничего не зависит; не требуется ни регистрировать какие-либо классы COM, ни даже вызывать обязательную функцию CoInitialize. Класс CComPtr активной библиотеки шаблонов (ATL — Active Template Library) берет на себя ответственность за остающийся небольшой слой COM. Однако, необходимо самостоятельно позаботиться о безопасности потока, поскольку XmlLite не является поточно-ориентированным анализатором для выполнения однопотоковых сценариев.
В следующих примерах я использую макрос COM_VERIFY для четкого определения того, где методы возвращают значение HRESULT, которое требуется проверять. Этот макрос можно заменить соответствующей обработкой ошибок — будет ли это создание исключения или возврат HRESULT.

Чтение XML
XmlLite предоставляет функцию CreateXmlReader, возвращающую реализацию интерфейса IXmlReader:
CComPtr<IXmlReader> reader;
COM_VERIFY(::CreateXmlReader(__uuidof(IXmlReader),
                             reinterpret_cast<void**>(&reader),
                             0));
Хотя он является необязательным, шаблон класса CComPtr быстро освобождает указатель интерфейса.
CreateXmlReader принимает идентификатор интерфейса (IID) наряду с указателем для указателя «void». Этот распространенный прием в программировании COM, позволяющий вызывающей стороне указать тип указателя интерфейса для возврата. В моем примере используется оператор __uuidof, являющийся характерным для Майкрософт ключевым словом, извлекающим GUID, связанный с типом. В этом случае он используется для извлечения идентификатора интерфейса IID. Последний аргумент CreateXmlReader принимает необязательную реализацию IMalloc с целью обеспечения вызывающей стороне возможности управлять распределением памяти.
После создания модуля чтения необходимо указать хранилище, которое модуль чтения будет использовать в качестве источника входных данных. Интерфейс IStream представляет хранилище, позволяя использовать XmlLite с любой реализацией, которая может быть разработана:
CComPtr<IStream> stream;

// Create stream object here...

COM_VERIFY(reader->SetInput(stream));
(Потоки будут обсуждаться в этой статье далее.)
После создания источника ввода для модуля чтения XML можно выполнять операции чтения посредством циклического вызова метода Read. Метод Read принимает необязательный аргумент, возвращающий тип узла при каждом успешном вызове. Метод Read возвращает значение S_OK для указания на успешность чтения очередного узла из потока и значение S_FALSE для указания того, что достигнут конец потока. Приведем пример перечисления узлов:
HRESULT result = S_OK;
XmlNodeType nodeType = XmlNodeType_None;

while (S_OK == (result = reader->Read(&nodeType)))
{
    // Get node-specific info
}
Для перечисления атрибутов текущего узла используются методы MoveToFirstAttribute и MoveToNextAttribute. Оба возвращают S_OK в случае успешного перемещения модуля чтения и S_FALSE, если больше нет атрибутов. В следующем примере показан способ перечисления атрибутов для заданного узла:
for (HRESULT result = reader->MoveToFirstAttribute(); 
     S_OK == result;
     result = reader->MoveToNextAttribute())
{
    // Get attribute-specific info
}
Когда вызывается метод IXmlReader, он автоматически сохраняет все атрибуты узлов во внутренней коллекции. Это позволяет переместить модуль чтения к конкретному атрибуту, используя его имя, применив для этого метод MoveToAttributeByName. Однако обычно более эффективным оказывается перечисление атрибутов и сохранение их в структуре данных, зависящей от приложения. Обратите внимание, что с помощью метода GetAttributeCount можно также определить число атрибутов в текущем узле.
После того, как зафиксирован узел или атрибут, получить о нем информацию не составляет труда. В следующем примере показан способ получения URI пространства имен и локального имени для заданного узла:
PCWSTR namespaceUri = 0;
UINT namespaceUriLength = 0;

COM_VERIFY(reader->GetNamespaceUri(&namespaceUri, 
                                   &namespaceUriLength));

PCWSTR localName = 0;
UINT localNameLength = 0;

COM_VERIFY(reader->GetLocalName(&localName, 
                                &localNameLength));
Все методы IXmlReader, возвращающие строковые значения, используют этот прием. Первый аргумент принимает указатель на строковую константу указателя. Второй аргумент является необязательным и, если он не равен нулю, он возвращает длину строки, выраженную в символах, за исключением нулевого конечного символа.
Приведем еще один пример акцента на производительности. Строковые указатели, возвращаемые методами IXmlReader, являются действительными только до тех пор, пока модуль чтения не будет перемещен к другому узлу, или текущий узел не будет сделан недействительным каким либо другим способом, например созданием нового входного потока или освобождением интерфейса IXmlReader. Другими словами, IXmlReader не возвращает копию потока вызывающей стороне.
В отличие от своих аналогов в .NET Framework, IXmlReader не предоставляет никаких методов для чтения типизированного содержимого. Если, например, в конкретном элементе или атрибуте содержится ряд дат, потребуется сначала получить их строковое представление, а затем самостоятельно преобразовать их требуемым образом. Многие другие вспомогательные методы, представленные в классе XmlReader среды .NET Framework, также отсутствуют в IXmlReader, но могут быть написаны в качестве вспомогательных функций. XmlLite безусловно соответствует идеологии C++, предусматривающей минимизацию модели интерфейса.
На рис. 2 показаны объекты и абстракции, участвующие в операции чтения документа XML с помощью IXmlReader. Однако следует помнить, что IStream мог бы использовать любое хранилище, и файл, показанный на рисунке, является просто распространенным примером.
Рис. 2 Модуль чтения 

Операция записи XML
XmlLite предоставляет функцию CreateXmlReader для возвращения реализации интерфейса IXmlReader:
CComPtr<IXmlWriter> writer;

COM_VERIFY(::CreateXmlWriter(__uuidof(IXmlWriter),
                             reinterpret_cast<void**>(&writer),
                             0));
После создания модуля записи необходимо указать хранилище, которое модуль записи будет использовать для вывода данных.
CComPtr<IStream> stream;

// Create stream object here

COM_VERIFY(writer->SetOutput(stream));
До начала операции записи можно изменить свойства модуля записи. Перечисление XmlWriterProperty определяет существующие свойства. Например, может потребоваться указать, предназначены ли выходные данные XML для чтения человеком; это можно сделать с помощью метода SetProperty:
COM_VERIFY(writer->SetProperty(XmlWriterProperty_Indent, TRUE));
Можно запустить операцию записи базового потока с помощью методов IXmlWriter. XmlLite поддерживает обработку фрагментов XML. Если предполагается записывать полный документ XML, необходима начать с вызова метода WriteStartDocument, отвечающего за запись описания XML. Описание зависит от используемой кодировки, но по умолчанию применяется UTF-8, являющаяся наиболее подходящей в большинстве случаев. (Кодировка текста будет обсуждаться несколько позже.) Для записи различных типов узлов, атрибутов и значений предоставляется ряд методов WriteXxx.
Рассмотрим следующий пример:
COM_VERIFY(writer->WriteStartDocument(XmlStandalone_Omit));
COM_VERIFY(writer->WriteStartElement(0, L"html", 
                                     L"http://www.w3.org/1999/xhtml"));

COM_VERIFY(writer->WriteStartElement(0, L"head", 0));
COM_VERIFY(writer->WriteElementString(0, L"title", 0, L"My Web Page"));
COM_VERIFY(writer->WriteEndElement()); // </head>

COM_VERIFY(writer->WriteStartElement(0, L"body", 0));
COM_VERIFY(writer->WriteElementString(0, L"p", 0, L"Hello world!"));

COM_VERIFY(writer->WriteEndDocument());
Метод WriteStartDocument обрабатывает запись описания XML в поток. Его единственный аргумент принимает значение от перечисления XmlStandalone, указывающее, является поступающее описание описанием одиночного документа, и если это так, какое значение оно содержит. При записи фрагмента XML вызов WriteStartDocument обычно не выполняется.
Метод WriteStartElement принимает три аргумента: первый указывает необязательный префикс пространства имен для элемента, второй указывает локальное имя элемента, а третий — необязательный URI пространства имен. WriteElementString является одним из немногих методов, предоставляемых XmlLite для повышения комфортности его использования. Следующий код для записи заголовка документа XHTML эквивалентен методу WriteElementString, использованному в предыдущем примере:
COM_VERIFY(writer->WriteStartElement(0, L"title", 0));
COM_VERIFY(writer->WriteString(L"My Web Page"));
COM_VERIFY(writer->WriteEndElement());
Понятно, что метод не является абсолютно необходимым, но очевидно, что он полезен.
Наконец, метод WriteEndDocument закрывает документ. Возможно, вы заметили, что тело и элементы html не были закрыты явным образом. Метод WriteEndDocument автоматически закрывает все открытые элементы. По этой причине освобождение модуля записи также закрывает все остальные элементы. Однако, привычка не закрывать явным образом такие элементы может привести, при невнимательности, к ошибкам, поскольку время существования потока и время существования модуля записи зачастую различаются. В этой ситуации, если требуется обеспечить, чтобы вся записываемая информация была записана в базовый поток, следует просто вызвать метод Flush модуля записи IXmlWriter.
На рис. 3 показан последовательность объектов и абстракций, участвующих в операции записи документа XML с помощью IXmlWriter. Следует помнить, что IStream мог бы использовать любое хранилище, и файл, показанный на рисунке, является просто распространенным примером.
Рис. 3 Модуль записи 

Работа с потоками
До сих пор о потоках было сказано немного. В отличие от библиотек XML, имеющих более полный набор функций, XmlLite не предоставляет никаких функций, поддерживающих чтение из общепринятых хранилищ (например, файлов или сетевых протоколов) и запись в них. По этой причине необходимо обеспечить реализацию IStream для произвольного хранилища, которое предполагается использовать для чтения и записи. Реализация интерфейса IStream не представляет сложностей, но во многих случаях вам не потребуется это делать, поскольку такие реализации уже существуют.
Функция CreateStreamOnHGlobal обеспечивает реализацию IStream, опирающуюся на виртуальную память. Первый аргумент является необязательным обработчиком памяти, созданным с помощью функции GlobalAlloc. Можно, однако, просто передать ноль, и CreateStreamOnHGlobal создаст для вас объект памяти. В следующем примере создается реализация IStream, опирающаяся на системную память и при необходимости динамически расширяющаяся:
CComPtr<IStream> stream;
COM_VERIFY(::CreateStreamOnHGlobal(0, TRUE, &stream));
Освобождение потока приводит к освобождению памяти.
Функция SHCreateStreamOnFile обеспечивает другую полезную реализацию IStream. Она создает интерфейс IStream на основе файла:
CComPtr<IStream> stream;
COM_VERIFY(::SHCreateStreamOnFile(L"D:\Sample.xml",
                                  STGM_WRITE | STGM_SHARE_DENY_WRITE,
                                  &stream));

Кодировка текста при чтении
Хотя XmlLite по умолчанию использует UTF-8 для записи и при попытке определить кодировку текста при чтении, это поведение можно переопределить. Во-первых, посмотрим, какие операции выполняются автоматически. При заданном потоке модуль чтения IXmlReader определяет признаки кодировки по метке порядка следования байтов, являющейся начальным элементом XML. IXmlReader обрабатывает также любую кодировку, указанную в описании XML. Эти свойства естественны для любого анализатора XML. Если имеется входной поток, в котором, возможно, не задано никакой информации о кодировке, и XmlLite не в состоянии эвристически определить используемую кодировку, тогда можно IXmlReader указать конкретную кодировку, задав кодовую страницу или имя кодировки.
Вместо передачи потока напрямую модулю чтения IXmlReader можно создать объект ввода модуля чтения XML под видом интерфейса IXmlReaderInput. Для создания объекта ввода, охватывающего входной поток, предусмотрены две функции. Функция CreateXmlReaderInputWithEncodingCodePage принимает значение типа кодировки в виде номера кодовой страницы. Функция CreateXmlReaderInputWithEncodingName принимает значение типа кодировки, заданное с помощью канонического имени. Не считая этого, данные функции имеют идентичные сигнатуры. Формулируя кратко, обычно входной поток для модуля чтения XML задается следующим образом:
CComPtr<IStream> stream;

// Create stream object here

COM_VERIFY(reader->SetInput(stream));
Для переопределения кодировки следует изменить код следующим образом:
CComPtr<IStream> stream;

// Create stream object here

CComPtr<IXmlReaderInput> input;

COM_VERIFY(::CreateXmlReaderInputWithEncodingName(stream,
                                                  0, // default allocator
                                                  L"ISO-8859-8",
                                                  TRUE, // hint
                                                  0, // base URI
                                                  &input));

COM_VERIFY(reader->SetInput(input));
Первый аргумент указывает поток, из которого модуль чтения XML будет выполнять чтение. Второй аргумент принимает необязательную реализацию IMalloc. Если он предоставляется, он заменяет собственную реализацию модуля чтения XML. Третий аргумент указывает имя кодировки. В документации, представленной на веб-узле по адресу msdn2.microsoft.com/ms752827.aspx, перечислены кодировки, поддерживаемые изначально; для поддержки других кодировок можно обеспечить реализацию интерфейса IMultiLanguage2. Следующий аргумент указывает, должна ли применяться указанная кодировка, или это просто подсказка. Значение TRUE дает анализатору указание использовать предложенную кодировку, но в случае неудачи анализатору разрешается попытка эвристического определения реальной кодировки. Значение FALSE дает анализатору указание использовать предложенную кодировку и в случае ее несоответствия входному потоку вернуть код ошибка. Следующий аргумент принимает необязательный базовый, который можно использовать для разрешения внешних объектов. Последний аргумент возвращает указатель интерфейса, представляющий объект ввода, предназначенный для передачи методу SetInput.

Кодировка текста при записи
Модуль записи XML определяет, какую кодировку следует использовать, на основе объекта, передаваемого методу SetOutput. Если объект реализует интерфейс IStream или даже ограниченный интерфейс ISequentialStream, модуль записи XML применяет кодировку UTF-8. Для переопределения этого поведения можно создать объект вывода модуля записи XML. Для создания объекта вывода, охватывающего выходной поток, предусмотрены две функции. Функция CreateXmlWriterOutputWithEncodingCodePage принимает значение типа кодировки в виде номера кодовой страницы, а функция CreateXmlWriterOutputWithEncodingName принимает тип кодировки, заданный каноническим именем. Не считая этого, данные функции имеют идентичные сигнатуры. Обычно выходной поток для модуля записи XML задается следующим образом:
CComPtr<IStream> stream;

// Create stream object here

COM_VERIFY(writer->SetOutput(stream));
Для переопределения типа кодировки по умолчанию используйте следующий код:
CComPtr<IStream> stream;

// Create stream object here

CComPtr<IXmlWriterOutput> output;

COM_VERIFY(::CreateXmlWriterOutputWithEncodingName(stream,
                                                   0,
                                                   L"ISO-8859-8",
                                                   &output));

COM_VERIFY(writer->SetOutput(output));
Первый аргумент указывает поток, в который модуль записи XML будет выполнять запись. Второй аргумент принимает необязательную реализацию IMalloc. Если он предоставляется, он заменяет собственную реализацию модуля записи XML. Третий аргумент указывает имя кодировки. Последний аргумент возвращает указатель интерфейса, представляющий объект вывода, предназначенный для передачи методу SetOutput.

Работа с большими значениями данных
Для ограничения использования памяти при чтении больших значений данных модуль чтения XML предоставляет механизм чтения значений частями. Метод IXmlReader ReadValueChunk выполняет чтение заданного максимального числа символов, продвигая модуль чтения вперед для последующих вызовов. Этот пример демонстрирует способ повторного вызова ReadValueChunk для чтения большого значения данных:
CString value;

WCHAR chunk[256] = { 0 };
HRESULT result = S_OK;
UINT charsRead = 0;

while (S_OK == (result = reader->ReadValueChunk(chunk,
                                                countof(chunk),
                                                &charsRead)))
{
    value.Append(chunk, charsRead);
}
Метод ReadValueChunk возвращает S_FALSE по концу данных. В этом примере фрагменты данных записываются в объект CString. Это сделано только для демонстрации способа работы с длиной фрагмента и, очевидно, в реальности лишает смысла преимущества разбиения данных на части.

Вопросы безопасности
Приложениям, основанным на использовании XML, неизменно приходится иметь дело с XML, поступающим из ненадежных источников. XmlLite предоставляет ряд возможностей для защиты приложений от известных и будущих уязвимостей.
В документах XML могут содержаться ссылки на внешние объекты. Некоторые анализаторы XML разрешают эти ссылки автоматически. Будучи потенциально полезным, такой подход может привести к злоупотреблениям, если не предусмотреть в модуле разрешения XML средства снижения опасности от различных угроз. XmlLite не выполняет автоматически разрешение внешних объектов, и не предоставляет модуля разрешения XML. Для обеспечения своей собственной реализации (в случае необходимости), следует реализовать интерфейс IXmlResolver и использовать свойство XmlReaderProperty_XmlResolver с методом IXmlReader SetProperty для указания модулю чтения необходимости использовать данный модуль разрешения.
В документах XML могут содержаться также инструкции обработки DTD. Хотя XmlLite не поддерживает проверку документов (с использованием схемы XML или DTD), он поддерживает расширение объекта DTD и атрибуты по умолчанию. Поскольку в этих DTD могут содержаться ссылки на внешние объекты, они могут открывать ваше приложения для различных атак. По умолчанию XmlLite отключает обработку DTD. При задании для свойства XmlReaderProperty_DtdProcessing значения DtdProcessing_Parse разрешается обработка DTD. Существует также встроенное средство ограничения атак расширения объекта DTD (называемое также атакой биллиона смешков), управляемое свойством XmlReaderProperty_MaxEntityExpansion. По умолчанию для этого свойства задается значение 1000 000.
Другой способ злоупотребления приложениями, использующими XML, заключается в создании документов с очень длинными именами. Если не перекрыть эту возможность, она может привести к использованию огромных объемов памяти и привести к атаке типа отказа в обслуживании. Я уже давал подсказки относительно того, что можно сделать. Один очевидный способ снижения такой угрозы состоит в чтении больших значений данных частями, как описано в предыдущем разделе. Другой полезный метод заключается в предоставлении пользовательской реализации IMalloc с ограничениями на выделение памяти. При заданном входном потоке, поддерживающем произвольный доступ, можно также передать модулю чтения XML инструкцию избегать кэширования атрибутов с помощью свойства. Это снижает объем памяти, используемой для чтения начального тега элемента, но может замедлить синтаксический анализ, поскольку анализатору придется выполнять поиск в обоих направлениях для извлечения различных значений атрибутов в соответствии с запросом.
Чрезмерно глубокая иерархия XML также приводит к быстрому исчерпыванию ресурсов системы. Для блокировки предоставления атакующими документов XML с чрезмерно глубокой иерархией можно использовать свойство XmlReaderProperty_MaxElementDepth, чтобы ограничить разрешенную для анализатора глубину обработки. По умолчанию значение этого свойства — 256.

Заключение
XmlLite предоставляет мощный синтаксический анализатор XML для приложений на традиционном C++. Он увеличивает производительность, владеет информацией о состоянии используемых ресурсов системы и обеспечивает существенную гибкость при управлении этими характеристиками. Поддерживая все распространенные типы кодировок текста, XmlLite является очень полезным и практичным инструментом, упрощающим использование XML в приложениях на традиционном C++. Подробнее см. документацию по XmlLite веб-узле по адресу ®msdn2.microsoft.com/ms752872.aspx.

Кенни Керр (Kenny Kerr) — искусный специалист в области разработки программного обеспечения для Windows. Он с большим энтузиазмом занимается написанием статей по программированию и проектированию программного обеспечения и обучением разработчиков. Связаться с Кенни можно в блоге по адресу http://weblogs.asp.net/kennykerr.




Комментарии

Дядя
28-01-2010   
Какой тебе еще список дурик нужен, и так все ясно.

Xek
25-01-2010   
и хули вы список литературы не написали?

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Web - программирование / XML /

Некоторые примеры использования XML
07-03-2010   

Вам необходимо многократно передавать табличный результат в хранимую процедуру. Несмотря на то, что SQL Server 2000 и SQL Server 2005 имеют тип данных, который называется табличной переменной... подробнее

Кол. просмотров: общее - 3804 сегодня - 1

Небольшой и быстродействующий синтаксический анализатор XML для традиционного C++
23-09-2009   

Несмотря на возрастающий успех .NET Framework, Майкрософт по-прежнему серьезно относится к развитию традиционного C++. Это доказывается представлением XmlLite, высокопроизводительного и потребляющего мало ресурсов средства чтения и записи XML, предназначенного для приложений, написанных на традиционном C++... подробнее

Кол. просмотров: общее - 3652 сегодня - 3

Операции протокола SNMP
14-04-2009   

SNMP является простым протоколом запроса/ответа. Узлы могут отправлять множество запросов, не получая ответа. Определены следующие 4 операции SNMP... подробнее

Кол. просмотров: общее - 2959 сегодня - 1

DTD-определения для XML-документа
14-04-2009   

Пример Documents Type Definitions (DTD) для XML-документа... подробнее

Кол. просмотров: общее - 3034 сегодня - 0

Пример XML-документа
14-04-2009   

Вот небольшой пример типичного XML-документа... подробнее

Кол. просмотров: общее - 3038 сегодня - 1



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects