Пространства имен позволяют избежать конфликта имен XML элементов.
Конфликты имен
В XML имена элементов определяет разработчик. Часто это становится причиной конфликта имен при попытке одновременного использования нескольких XML документов от разных XML приложений.
Следующий код XML содержит информацию о HTML таблице:
Следующий код XML содержит информацию о столе (предмет мебели), который по англ. тоже table:
Если эти два фрагмента кода XML будут сведены вместе, то возникнет конфликт имен. Так как оба документа содержат элемент , хотя и с разным контентом и значением.
Пользователь или XML приложение не будут знать, каким образом обрабатывать эти различия.
Разрешение конфликта имен при помощи префикса
В XML избежать конфликта имен можно при помощи префикса имени элемента.
Следующий код XML содержит информацию о таблице HTML и о столе:
В этом примере не будет конфликта имен, так как два элемента имеют разные имена.
Пространства имен XML – Атрибут xmlns
При использовании в XML префиксов необходимо определить, так называемое, пространство имен префикса.
Пространство имен определяется благодаря атрибуту xmlns в начальном теге элемента.
В данном примере, атрибут xmlns в теге определяет префиксам h: и f: квалифицирующее пространство имен.
Когда пространство имен определено для какого-то элемента, то все его дочерние элементы с тем же префиксом ассоциируются с его пространством имен.
Пространства имен могут декларироваться либо непосредственно в самом элементе, либо в корневом элементе XML документа:
Замечание: URI пространства имен не используется парсером для получения какой-либо информации. Цель всего этого состоит в том, чтобы дать пространству имен уникальное имя. Тем не менее, часто компании используют пространство имен, как указатель на веб-страницу с информацией об этом пространстве имен.
Унифицированный идентификатор ресурса (URI)
Унифицированный идентификатор ресурса (URI) это символьная строка, идентифицирующая интернет-ресурс.
В наиболее общей форме URI является единым указателем ресурса (URL), который идентифицирует доменный адрес в интернете. Другой, более частный вид URI — единообразное имя ресурса (URN).
В наших примерах мы будем использовать только URL.
Пространства имен по умолчанию
Определение пространства имен по умолчанию позволяет избежать использования префиксов во всех дочерних элементах. Такое определение имеет следующий синтаксис:
Следующий код XML содержит информацию о таблице HTML:
Следующий код XML содержит информацию о предмете мебели — столе:
Реальное использование пространства имен
XSLT — это XML язык, который может использоваться для преобразования документов XML в другие форматы, например, HTML.
Пространства имен XML обеспечивают способ избежать конфликтов имен элементов.
Имя конфликты
В XML, имена элементов определяются разработчиком. Это часто приводит к конфликту при попытке смешивать XML-документы из различных приложений XML.
Этот XML несет в себе информацию таблицы HTML:
Этот XML несет в себе информацию о таблице (a piece of furniture) :
Если эти фрагменты XML были добавлены вместе, не было бы конфликта имен. Оба содержат
элемент, но элементы имеют различное содержание и значение.
Пользователь или приложение XML не будет знать, как обрабатывать эти различия.
Решение конфликта имен с использованием префикса
Имя конфликты в XML можно легко избежать, используя префикс имен.
Этот XML несет в себе информацию о HTML-таблицы, и предмет мебели:
African Coffee Table 80 120
При использовании префиксов в XML, A namespace должен быть определен для префикса.
Пространство имен может быть определено с помощью xmlns атрибута в начальном теге элемента.
African Coffee Table 80 120
В приведенном выше примере:
В xmlns атрибут в первом
элемент дает час: префикс квалифицированных имен.
В xmlns атрибут во втором
элемент дает п: префикс квалифицированное имен.
Когда пространство имен определено для элемента, все дочерние элементы с одинаковым префиксом связаны с тем же пространством имен.
Пространства имен также могут быть объявлены в корневой XML-элемент:
African Coffee Table 80 120
Note: Пространство имен URI не используется анализатором для поиска информации.
Цель с помощью URI, чтобы дать пространству имен уникальное имя.
Тем не менее, компании часто используют пространство имен как указатель на веб-страницу, содержащую информацию о пространстве имен.
Унифицированный идентификатор ресурса (URI)
По умолчанию Namespaces
Определение пространства имен по умолчанию для элемента спасает нас от использования префиксов во всех дочерних элементов. Он имеет следующий синтаксис:
Этот XML несет в себе информацию таблицы HTML:
Этот XML несет в себе информацию о предмете мебели:
Пространства имен в реальном использовании
XSLT представляет собой язык, который может быть использован для преобразования XML-документов в другие форматы.
Документ XML ниже, представляет собой документ, используемый для преобразования XML в HTML.
Пространства имен XML связывают имена элементов и атрибутов в XML-документе с пользовательскими и стандартными URI. Для создания этих связей определяются префиксы для URI пространства имен, с помощью которых затем квалифицируются имена элементов и атрибутов в XML-данных. Пространства имен предотвращают конфликты имен элементов и атрибутов, а также позволяют обрабатывать и проверять элементы и атрибуты с одним и тем же именем.
Объявление пространств имен
Пространство имен для элемента объявляется с помощью атрибута xmlns: :
где — это префикс пространства имен, а — это URI, который определяет это пространство имен. После объявления префикса его можно использовать для уточнения имен элементов и атрибутов в XML-документе и связывания их с URI-кодом пространства имен. Так как этот префикс пространства имен используется во всем документе, он должен быть коротким.
Область видимости объявления
Пространство имен можно использовать только после его объявления, однако это не значит, что объявление пространства имен должно располагаться в самом начале XML-документа.
Если в XML-документе используются несколько пространств имен, можно определить одно из них как пространство по умолчанию, чтобы упростить чтение документа. Пространство имен по умолчанию объявляется в корневом элементе и применяется ко всем элементам в документе, которые не квалифицированы. Пространства имен по умолчанию применяются только к элементам и не применяются к атрибутам.
Для использования пространства имен по умолчанию не указывайте префикс и двоеточие в объявлении элемента:
Управление пространствами имен
В классе XmlNamespaceManager хранится коллекция URI пространств имен и их префиксов. С его помощью можно искать, добавлять и удалять пространства имен из этой коллекции. В некоторых контекстах этот класс необходим для повышения производительности обработки XML. Например, класс XsltContext используется классом XmlNamespaceManager для обеспечения поддержки XPath.
Диспетчер пространств имен не выполняет проверку пространств имен, так как предполагается, что префиксы и пространства имен уже проверены и соответствуют спецификации W3C для пространств имен.
Интерфейс LINQ to XML в C# и Visual Basic использует XmlNamespaceManager для управления пространствами имен. Дополнительные сведения об управлении пространствами имен в случае использования LINQ to XML см. в документации по LINQ, в разделах Работа с пространствами имен XML (C#) и Работа с пространствами имен XML (Visual Basic).
Вот некоторые из задач по управлению и подстановке, которые можно выполнить с помощью класса XmlNamespaceManager. Дополнительные сведения и примеры см. в разделах справочника, посвященных каждому методу или свойству.
Это очередной урок по основам XML и в нем мы рассмотрим такую тему как пространства имен. Если выражаться простыми словами, то в XML пространства имен используются грубо говоря для придания уникальности каждому отдельному элементу XML. Как вы помните из предыдущих статей, каждый разработчик, работая с XML, как бы сам изобретает свой язык. В связи с этим чтобы все элементы документа были уникальны и несли свой смысл, используются так называемые пространства имен, речь о которых и пойдет в данной статье.
Чтобы лучше понять всю суть вышесказанного, давайте рассмотрим небольшой пример. Допустим у нас есть документ в котором используются несколько логических схем, которые имеют одинаковые элементы, используемые в разных смыслах. Если бы схема была одной, то особых проблем не возникало бы, но поскольку их несколько, то становится невозможным определить, какой элемент относится к какой схеме или какие схемы используются в документе вообще.
В связи с этим были разработаны пространства именXML. Чтобы различать схемы документов, для каждой из них ставится в соответствие специальный уникальный идентификатор ресурса или URI. В результате схемы будут считаться тождественными только в том случае, если уникальные идентификаторы будут совпадать. В связи с этим в качестве идентификатора чаще всего используется адрес своего ресурса.
Стоит заметить, что не обязательно, чтобы по этому адресу что-то находилось. Обработчик не будет переходить по ссылке и проверять наличие какой-либо информации. Она используется чисто как уникальный идентификатор, а поскольку это еще и URL своего ресурса, то вряд ли кто-то будет использовать его в качестве идентификатора для своей схемы.
Итак, с теорией мы разобрались. Теперь давайте перейдем непосредственно к рассмотрению префиксов пространств имен и примеров правильного их использования.
Префиксы пространств имен XML. Примеры использования пространств имен в XML и XSLT
Как уже говорилось чуть выше, пространства имен задаются при помощи уникальных идентификаторов URI. Чтобы упростить работу с ними, были разработаны специальные префиксы пространств имен, которые позволяют с легкостью определить, какой схеме принадлежит тот или иной элемент документа. Чтобы это продемонстрировать, рассмотрим небольшой пример.
Как видно с примера, префиксы пространств имен задаются как атрибуты с именами, которые начинаются последовательностью xmlns. Если говорить об XSLT, то там чаще всего используется префикс xsl. На практике все это выглядит следующим образом.
В качестве префикса пространств имен может использоваться и любое другое название, например, ddd. В этом случае код будет выглядеть следующим образом.
Вышеприведенные два примера абсолютно идентичны между собой и ничем не будут отличаться. Стоит сразу заметить, что созданный префикс пространств имен может использоваться только в собственном имени и во вложенных элементах, но никак не за пределами элемента в котором он был создан. Для наглядности рассмотрим следующий пример.
Еще один момент, на который стоит обратить внимание, это то, что сами префиксы не определяют элемент к той или иной схеме. Это делают уникальные идентификаторы, которые поставлены в соответствие этим префиксам. Таким образом, два элемента с разными префиксами которым заданы одинаковые идентификаторы будут считаться принадлежащими к одной схеме. Чтобы продемонстрировать это, рассмотрим следующий пример.
Несмотря на то, что элементы stylesheet и text имеют разные префиксы, они принадлежат одной схеме, так как их префиксам проставлены в соответствие одинаковые идентификаторы. Таким образом, в документе может использоваться любое количество префиксов пространств имен. Зачастую все они определяются в корневом элементе, а потом просто используются в нужном месте документа. И опять еще один пример для демонстрации.
Существует еще один способ, который позволяет не проставлять префиксы в элементах. Для этого достаточно задать пространство имен по умолчанию. В этом случае все вложенные элементы будут принадлежать пространству имен родительского элемента. При этом не теряется возможность использовать другие пространства имен для дочерних элементов. Для этого достаточно вручную прописать нужное пространство имен, используя атрибут xmlns.
Здесь стоит обратить внимание, что элементы one и two будут принадлежать пространству имен элемента thirdelement, так как он является для них родительским. Как видим, здесь прослеживается так называемое наследование. Если для элемента не указано пространство имен, то ему автоматически присваивается пространство имен ближайшего родительского элемента.
Обычно вышеприведенный способ не очень популярный и чаще всего используются префиксы пространств имен. Но в некоторых случаях их можно опустить и использовать способ с заданием пространства имен по умолчанию. Чтобы не оставалось никаких вопросов рассмотрим аналогичный способ представления последнего примера.
На этом мы заканчиваем рассмотрение пространств имен и в следующей статье поговорим об основных моментах описания структуры XML-документов при помощи DTD. Если вы не хотите пропустить выпуска новых статей, рекомендую подписаться на новостную рассылку, воспользовавшись формой подписки ниже.
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет поддержку обработки XML, основанную на стандартах.
Классы
Реализует однопотоковый объект XmlNameTable.
Уникальный идентификатор, оптимизированный для GUID.
Представляет атрибут. Допустимые значения и значения по умолчанию для атрибута определены в определении типа документа (DTD) или схеме.
Представляет коллекцию атрибутов, к которым можно обращаться по имени или индексу.
Обеспечивает динамическое управление оптимизированными строками
Позволяет использовать динамический словарь для сжатия общих строк, присутствующих в сообщении и сохраняющих состояние.
Представляет раздел CDATA.
Предоставляет методы обработки текста, которые используются несколькими классами.
Представляет содержимое комментария XML.
Кодирует и декодирует имена XML и предоставляет методы для преобразования между типами общеязыковой среды выполнения и типами языков определения схем XML (XSD). При преобразовании типов данных возвращаемые значения не зависят от языкового стандарта.
Обеспечивает хранение, получение и управление структурированными данными с использованием реляционного объекта DataSet.
Реализует словарь, используемый для оптимизации реализаций модулей чтения и записи XML в Windows Communication Foundation (WCF).
Содержит настраиваемые значения квоты для XmlDictionaryReaders.
Представляет запись, которая хранится в XmlDictionary.
Представляет абстрактный класс, который Windows Communication Foundation (WCF) наследует от XmlWriter для выполнения сериализации и десериализации.
Представляет XML-документ. Этот класс можно использовать для загрузки, проверки, изменения, добавления и размещения XML-кода в документе.
Представляет простой объект, полезный для операций вставки дерева.
Представляет объявление типа документа.
Предоставляет методы расширения для XmlDocument и XmlNode для навигации по документу.
Представляет узел ссылки на сущность.
Подробные сведения о последнем исключении.
Определяет контекст набора объектов XmlDocument.
Получает узел, непосредственно предшествующий данному узлу или следующий сразу же за ним.
Представляет коллекцию узлов, к которым можно обращаться по имени или индексу.
Разрешает, добавляет и удаляет пространства имен из коллекции и обеспечивает управление областью для этих пространств имен.
Таблица атомизированных строковых объектов.
Представляет отдельный узел в XML-документе.
Представляет упорядоченную коллекцию узлов.
Предоставляет средство чтения, обеспечивающее быстрый прямой доступ (без кэширования) к данным XML в классе XmlNode.
Предоставляет все контекстные данные, необходимые объекту XmlReader для анализа фрагмента XML.
Представляет инструкцию по обработке, которая определяется в XML для хранения в тексте документа сведений, относящихся к обработчику.
Представляет полное имя XML.
Предоставляет средство чтения, обеспечивающее быстрый прямой доступ (без кэширования) к данным XML.
Задает набор функций, которые должны поддерживаться объектом XmlReader, создаваемым с помощью метода Create.
Разрешает внешние ресурсы XML, имена которых заданы с помощью универсального кода ресурса (URI).
Позволяет защитить другую реализацию XmlResolver путем применения программы-оболочки к объекту XmlResolver и ограничения ресурсов, доступ к которым имеет базовый объект XmlResolver.
Представляет пробел между элементами разметки в смешанном узле содержимого или пробел в области xml:space= ‘preserve’. Он также называется значащим пробелом.
Представляет текстовое содержимое элемента или атрибута.
Предоставляет средство чтения, обеспечивающее быстрый прямой доступ (без кэширования) к данным XML.
Представляет средство записи, предоставляющее способ быстрого прямого создания потоков (без кэширования) или файлов с данными XML, которые соответствуют рекомендациям консорциума W3C по языку XML версии 1.0 и пространств имен в XML.
Разрешает внешние ресурсы XML, имена которых заданы с помощью универсального кода ресурса (URI).
Представляет средство чтения, обеспечивающее проверку определения DTD, схемы XDR и языка определения схемы XML.
Представляет пробел в содержимом элемента.
Представляет средство записи, обеспечивающее быстрый прямой способ (без кэширования) создания потоков или файлов, содержащих XML-данные.
Задает набор функций, которые должны поддерживаться объектом XmlWriter, создаваемым с помощью метода Create.
Тип XmlXapResolver используется для разрешения ресурсов в пакете XAP приложения Silverlight.
Интерфейсы
Представляет сопоставитель потока ресурсов приложения.
Содержит свойства и методы, которые, при реализации с помощью XmlDictionaryWriter, позволяют обрабатывать фрагменты XML.
Позволяет классу возвращать объект XmlNode из текущего контекста или позиции.
Представляет интерфейс, который может реализовываться классами, предоставляющими потоки.
Предоставляет методы для повторной инициализации средства чтения двоичных данных для считывания нового документа.
Указывает требования реализации для модулей записи двоичных данных XML, полученных из этого интерфейса.
Предоставляет интерфейс для включения класса, возвращающего сведения о строке о позиции.
Указывает требования реализации для MTOM-модулей чтения текста XML, полученных из этого интерфейса.
Будучи реализованным модулем записи MTOM, этот интерфейс обеспечивает инициализацию модуля записи MTOM.
Предоставляет доступ только для чтения к набору сопоставлений префиксов и пространств имен.
Указывает требования реализации для модулей чтения текста XML, полученных из этого интерфейса.
Указывает требования реализации для модулей записи текста XML, полученных из этого интерфейса.
Перечисления
Задает количество проверок ввода-вывода, которые выполняют объекты XmlReader и XmlWriter.
Задает параметры для обработки DTD. Перечисление DtdProcessing используется классом XmlReaderSettings.
Задает способ обработки сущностей средством XmlTextReader или XmlValidatingReader.
Задает параметры форматирования для XmlTextWriter.
Указывает, нужно ли удалять дубликаты объявлений в объекте XmlWriter.
Задает порядок обработки разрывов строк.
Задает состояние читателя.
Указывает тип выполняемой проверки.
Указывает способ обработки пробелов.
Задает состояние объекта XmlWriter.
Определяет способ обработки значения времени при преобразовании между строками и объектами DateTime.
Перечисляет настраиваемые значения квоты для класса XmlDictionaryReaders.
Определяет область пространства имен.
Задает тип изменения узла.
Описывает документный порядок узла по отношению ко второму узлу.
Задает метод, используемый для сериализации выходных данных объекта XmlWriter.
Представляет тип XML для строки. Это позволяет читать строку как определенный тип XML, например как тип раздела CDATA.
Делегаты
delegate для метода обратного вызова при закрытии модуля чтения.
Комментарии
Поддерживаемые стандарты
System.XmlПространство имен поддерживает следующие стандарты:
Пространства имен XML, как на уровне потока, так и в модели DOM
В разделе различия спецификаций W3C приведены два варианта, в которых классы XML отличаются от рекомендаций консорциума W3C.
Связанные пространства имен
.NET также предоставляет другие пространства имен для операций, связанных с XML. Список, описания и ссылки см. в разделе System.Xml пространства имен.
Асинхронная обработка XML
System.Xml.XmlReaderКлассы и System.Xml.XmlWriter включают ряд асинхронных методов, основанных на асинхронной модели программирования. Эти методы могут быть идентифицированы строкой Async в конце их имен. С помощью этих методов можно написать асинхронный код, аналогичный синхронному коду, и можно легко перенести существующий синхронный код в асинхронный код.
Используйте асинхронные методы в приложениях, где возникает значительная задержка сетевого потока. Избегайте использования асинхронных API-интерфейсов для потоков памяти или локальных файловых потоков операций чтения и записи. Входной поток, XmlTextReader и XmlTextWriter должен также поддерживать асинхронные операции. В противном случае потоки по-прежнему будут блокироваться операциями ввода-вывода.
Не рекомендуется смешивать синхронные и асинхронные вызовы функций, так как вы можете забыть использовать await ключевое слово или использовать синхронный API, где требуется асинхронный интерфейс.
Не устанавливайте XmlReaderSettings.Async флаг или, XmlWriterSettings.Async true Если вы не планируете использовать асинхронный метод.
Если вы забыли указать await ключевое слово при вызове асинхронного метода, результаты будут недетерминированными: вы можете получить ожидаемый результат или исключение.
Когда XmlReader объект считывает большой текстовый узел, он может кэшировать только частичное текстовое значение и вернуть текстовый узел, поэтому извлечение XmlReader.Value свойства может быть заблокировано операцией ввода-вывода. Используйте XmlReader.GetValueAsync метод, чтобы получить текстовое значение в асинхронном режиме, или используйте XmlReader.ReadValueChunkAsync метод для чтения большого текстового блока в блоках.
При использовании XmlWriter объекта вызовите XmlWriter.FlushAsync метод перед вызовом, XmlWriter.Close чтобы избежать блокировки операции ввода-вывода.
Отличия спецификаций W3C
В двух случаях, в которых задействованы ограничения для компонентов схемы группы моделей, System.Xml пространство имен отличается от рекомендаций консорциума W3C.
Согласованность в объявлениях элементов:
В некоторых случаях, когда используются группы подстановок, System.Xml реализация не удовлетворяет «ограничению компонента схемы: объявлений элементов», который описан в разделе ограничения на компоненты схемы группы моделей W3C Spec.
Например, следующая схема включает элементы с одинаковыми именами, но разными типами в одной и той же модели содержимого, и используются группы подстановок. Это может вызвать ошибку, но System.Xml компилирует и проверяет схему без ошибок.
Однозначное соотнесение примитивов:
В следующих случаях System.Xml реализация не удовлетворяет параметру «ограничение компонента схемы: уникальное соотнесение примитивов», которое описано в разделе ограничения для компонентов схемы группы моделей W3C Spec.
Один из элементов в группе ссылается на другой элемент.
Элемент, на который указывает ссылка, является головным элементом группы подстановки.
Группа подстановок содержит элемент, имя которого совпадает с именем одного из элементов в группе.
Замечания по безопасности
Также обратите внимание, что при использовании System.Xml типов и членов, если XML содержит данные, потенциально влияющие на конфиденциальность, необходимо реализовать приложение таким образом, чтобы оно соблюдает конфиденциальность конечных пользователей.
Внешний доступ
Несколько XML-технологий позволяют получать в ходе обработки другие документы. Например, определение типа документа (DTD) может находиться в документе, для которого выполняется синтаксический анализ. DTD может также находиться во внешнем документе, на который ссылается анализируемый документ. Язык XSD и технологии XSLT также позволяют включать сведения из других файлов. Эти внешние ресурсы могут представлять некоторые проблемы безопасности. Например, необходимо убедиться, что приложение извлекает файлы только с надежных сайтов и что извлекаемый файл не содержит вредоносных данных.
XmlUrlResolverКласс используется для загрузки XML-документов и для разрешения внешних ресурсов, таких как сущности, DTD или схемы, а также для импорта или включения директив.
Этот класс можно переопределить и указать XmlResolver используемый объект. Использовать класс XmlSecureResolver рекомендуется, если вам необходимо открыть ресурс, которым вы не управляете или к которому нет доверия. Класс XmlSecureResolver упаковывает объект XmlResolver и позволяет ограничить ресурсы, доступные для базового объекта XmlResolver.
Отказ в обслуживании
Следующие сценарии считаются менее уязвимыми для атак типа «отказ в обслуживании», так как классы System.Xml обеспечивают средства защиты от таких атак.
Синтаксический анализ текстовых XML-данных.
Анализ двоичных XML-данных, если двоичные XML-данные были созданы Microsoft SQL Server.
Запись XML-документов и фрагментов из источников данных в файловую систему, потоки, TextWriter или StringBuilder.
Загрузка документов в объект DOM, если используется объект XmlReader, а свойство XmlReaderSettings.DtdProcessing имеет значение DtdProcessing.Prohibit.
Навигация по объекту DOM.
Приведенные ниже сценарии использовать не рекомендуются, если есть угроза атак типа «отказ в обслуживании» или при работе в ненадежной среде.
Обработка схем. Сюда относится добавление в коллекцию схем схемы без доверия, компиляция схемы без доверия и проверка с использованием схемы без доверия.
Синтаксический анализ произвольного потока предоставленных пользователем двоичных XML-данных.
DOM-операции, например запросы, изменение, перемещение поддеревьев между документами и сохранение объектов DOM.
Если вы беспокоитесь о проблемах отказа в обслуживании или при работе с ненадежными источниками, не включайте обработку DTD. По умолчанию этот параметр отключен для XmlReader объектов, XmlReader.Create создаваемых методом.
Класс XmlTextReader по умолчанию разрешает обработку DTD. Чтобы отключить эту функцию, воспользуйтесь свойством XmlTextReader.DtdProcessing.
Если обработка DTD включена, можно использовать XmlSecureResolver класс для ограничения ресурсов, XmlReader к которым может получить доступ. Можно также спроектировать приложение таким образом, чтобы обработка XML была ограничена памятью и временем. например, можно настроить ограничения времени ожидания в приложении ASP.NET.
Вопросы обработки
XML-документы могут содержать ссылки на другие файлы, поэтому трудно определить, сколько вычислительных ресурсов потребуется для синтаксического анализа XML-документа. Например, XML-документы могут содержать DTD. Если DTD содержит сущности или сложные модели содержимого, то для синтаксического анализа документа может потребоваться слишком много времени.
При использовании XmlReader можно ограничить размер документа, который может быть подвергнут синтаксическому анализу, задав свойство XmlReaderSettings.MaxCharactersInDocument. Можно ограничить число символов, появляющихся в результате развертывания сущностей, задав свойство XmlReaderSettings.MaxCharactersFromEntities. Примеры настройки этих свойств см. в соответствующих разделах справки.
Технологии XSD и XSLT имеют дополнительные возможности, которые могут влиять на производительность при обработке. Например, можно построить схему XML, для обработки которой даже при сравнительно небольшом размере документа потребуется значительное время. Кроме того, можно внедрять блоки скриптов в таблицу стилей XSLT. Оба варианта представляют потенциальную угрозу безопасности для вашего приложения.
При создании приложения, использующего XslCompiledTransform класс, следует учитывать следующие элементы и их последствия.
Скрипты XSLT отключены по умолчанию. Скрипты XSLT следует включать только при необходимости в поддержке скриптов и при работе в полностью доверенной среде.
Функция XSLT document() отключена по умолчанию. Если функция document() включена, ограничьте ресурсы, к которым можно получить доступ путем передачи объекта XmlSecureResolver методу XslCompiledTransform.Transform.
Объекты расширения по умолчанию включены. Если методу XsltArgumentList передается объект XslCompiledTransform.Transform, содержащий объекты расширения, то используются объекты расширения.
Таблицы стилей XSLT могут содержать ссылки на другие файлы и внедренные блоки скриптов. Этим может воспользоваться злонамеренный пользователь: он может передать такие данные или таблицы стилей, которые при выполнении будут задействовать все доступные ресурсы компьютера.
Приложения XSLT, работающие в среде со смешанным доверием, могут привести к подмене таблицы стилей. Например, злонамеренный пользователь может загрузить объект с вредоносной таблицей стилей и передать ее другому пользователю, который впоследствии вызовет метод XslCompiledTransform.Transform и выполнит преобразование.
Обработка исключений
Исключения, вызываемые компонентами нижнего уровня, могут раскрывать сведения о пути, которые не должны предоставляться приложению. Приложения должны перехватывать исключения и обрабатывать их соответствующим образом.