Сила параметров XmlElement в Web-методах ASP.NET


VS2010 смущает System.Xml.XmlElement с System.Xml.Linq.XElement?

Я создал службу WCF с одним методом, который возвращает System.Xml.XmlElement :

Интерфейс:

Услуги:

Когда я пытаюсь получить доступ к службе, развернутой на моем сервере

Я получаю сообщение об ошибке:

Невозможно неявно преобразовать тип ‘System.Xml.Linq.XElement’ в ‘System.Xml.XmlElement’

В моем сервисном решении я не вижу ссылки на System.Xml.Linq.XElement . Неправильно ли я ожидать, что System.Xml.XmlElement или VS 2010 обманывает меня?

То, что я нашел, работает наилучшим и легким для меня, — это щелкнуть правой кнопкой мыши ссылку на службу, а затем нажать «Настройка справки службы». В диалоговом окне для этого внизу вы увидите 2 переключателя, которые говорят «Типы повторного использования в все ссылочные сборки» или «Типы повторного использования в указанных ссылочных ассамблях». Нажмите на второй вариант для «определенных сборок». Затем будет активирован список, и вы сможете проверить все сборки и оставить System.Xml.Linq непроверенным. Таким образом, каждый раз, когда вы обновляете ссылку на службу, вы получите ожидаемые результаты, и это будет сохранено в конфигурации клиента.

1) Удалите ссылку system.xml.linq с вашего клиента 2) Обновите свою служебную ссылку 3) Сгенерированный файл Reference.cs теперь будет ссылаться на XmlElement вместо XElement

Ненавижу отвечать на свой вопрос, но вот оно:

Насколько я вижу, System.Xml.XmlElement CAN может использоваться как возвращаемый тип для службы WCF. DataContractSerializer , используемый по умолчанию в WCF, поддерживает этот тип, и поэтому не нужно использовать XmlSerializer .

Однако моя проблема не имеет ничего общего с сериализацией, но благодаря Raj Kaimal, предлагая эту возможность.

12. Работа с данными в формате XML

Работа с данными в формате XML в приложениях ASP.NET 2.0, объект XmlDataDocument и элемент управления XML

Этот модуль посвящен тому, как можно работать с данными в формате XML из приложений ASP.NET.

XML расшифровывается как Extensible Markup Language (расширяемый язык разметки), хотя сам XML — это не язык. XML — набор правил, используемых для создания своих языков разметки. Например, представим себе, что у нас существуют такие данные о сотруднике:

Эти данные, конечно, можно представить как угодно: в виде таблицы в реляционной базе данных, в виде таблицы Excel или HTML, в виде таблицы в документе Word или в виде текстового документа ASCII, в виде файла *.csv и т.п. Если мы представим их в формате придуманного нами XML-совместимого языка разметки ABML (Address Book Markup Language), то они будут выглядеть так:

Невский пр , д .1

Немного о том, как расшифровать этот код. Первые две строки — это пролог (использовать его, в принципе, необязательно, но очень рекомендуется). Строка

называется объявлением XML (XML Declaration) и говорит о том, что этот файл соответствует спецификации XML 1.0, принятой в качестве рекомендации World Wide Web Consortium 10 февраля 1998 года. Строка

называется определением типа документа (Document Type Definition) и говорит о том, что структура языка, которому соответствует этот документ, описана в файле abml.dtd (можно использовать и внутренние DTD, когда описание языка находится прямо в документе). Сейчас для описания структуры XML-совместимых языков чаще используются не DTD, а XML Schema — к ним проще обращаться и они обеспечивают больше возможностей, в частности, при описании различных типов данных. Эта же строка с использованием XML Schema может выглядеть так:

в зависимости от того, где лежит сама Schema — описание данного языка — в файле abml.xml или на Web-сервере (корпоративное хранилище схем от Microsoft — BizTalk Server).

Пример XML Schema для нашего языка может выглядеть так:

XML – это формализованный набор правил для «разметки» документа – то есть выделения его логической структуры. То, что находится внутри любого документа, совместимого с форматом XML, можно разбить на две категории: разметку и само содержание. Вся информация о разметки должна начинаться либо с символа амперсанда (&), либо с символа левой угловой скобки ( · Элементы (elements) – это наиболее распространенный тип информации о разметке. Элемент выделяет логическую составную часть документа. Обычный документ состоит из открывающих и закрывающих тегов, которые могут окружать содержимое, другой элемент, или и то, и другое вместе. Теги с названиями элемента заключаются в угловые скобки. Вот пример элемента:

· Атрибуты (attributes) состоят из пары имя атрибута/значение атрибута и применяются к элементам. Атрибуты положено помещать после имени элемента в открывающем теге. Например, атрибутами являются ширина и высота:

· Комментарии (comments) – это любой текст, который будет игнорироваться процессором XML. Пример:

· Инструкции обработки (processing instructions) используются для передачи информации приложению, обрабатывающему документ XML. Синтаксис инструкции обработки выглядит так:

· Ссылки на сущности (entity references) используются для того, чтобы помещать в документ зарезервированные символы или зарезервированные слова. К примеру, нам надо вставить в документ левую угловую скобку ( · Раздел CDATA (CDATA section) – это часть текста, которая не обрабатывается, как остальные части документа XML, а передаваться приложению напрямую. Это средство может пригодиться, например, при передаче приложению какого-либо кода.

Синтаксические принципы XML:

· Документы XML состоят из символов Unicode (Unicode – это 16-битный набор символов, который позволяет отображать документы на любых языках).

· XML чувствителен к регистру. Теги и в нем – это разные теги.

· Пустое пространство (whitespace) – это невидимые символы, такие, как пробел (ASCII 32), символ табуляции (ASCII 9), символы возврата каретки (ASCII 13) и символы перевода строки (ASCII 10). Пустое пространство игнорируется внутри тегов, но сохраняется в символьных данных (то есть между открывающим и закрывающим тегами). Пустое пространство в символьных данных передается обрабатывающему приложению.

· Многие компоненты XML должны иметь имена (наиболее наглядный пример – элементы и атрибуты). Правила именования XML выглядят следующим образом: имя XML должно начинаться с буквы или подчеркивания, за которым следует любое количество букв, цифр, дефисов, подчеркиваний или точек, например:

· Имя компонента XML не может начинаться с символов xml (как в верхнем, так и в нижнем регистре). Такие имена зарезервированы создателями спецификации для служебных целей.

· Символьные значения должны быть помещены в одинарные или двойные кавычки.

· В XML должен строго соблюдаться порядок вложенности тегов.

· Любому открывающему тегу в XML должен соответствовать закрывающий тег.

· Пустой тег в XML записывается как открывающий тег, перед правой угловой скобкой в котором стоит прямой слеш (/).

· В документе XML может быть только один корневой элемент.

В чем преимущества размещения данных в XML перед традиционными двоичными форматами? Почему в настоящее время большинство крупных производителей программного обеспечения либо уже полностью перешли на работу с данными в XML-совместимом формате (например, Micrоsoft Office 2003), либо планируют перейти в ближайшем будущем? Главная причина — данные в XML очень легко передавать между самыми разными приложениями и их очень легко преобразовывать. Дополнительные моменты, связанные с преимуществами XML:

  • Независимый формат данных — данные в формате XML можно открывать в любом XML-совместимом (точнее, совместимым с конкретной схемой) приложении. Пример: на любом предприятии документы хранятся в самых разных форматах — форматах разных версий Word, текстовых, HTML, PDF и т.п. Проблем из-за этого возникает очень много, радикально решаются при помощи XML.
  • Общий принцип — один источник данных (документ XML), много представлений. Наглядно можно продемонстрировать на примере Web-сайта, к которому нужно обращаться из разных броузеров и через WAP.
  • Гораздо более простая передача данных «сквозь» приложения. Примеры — прохождение документов через цепочку поставщиков, или прохождение данных между разнородными программными продуктами на одном предприятии (что необходимо очень часто).
  • Улучшенные возможности поиска данных. Во-первых, нет необходимости обращаться к документам разных двоичных форматов, во-вторых, иерархическая структура документов XML облегчает поиск.
  • Более простая разработка приложений — нет необходимости реализовывать в приложениях поддержку большого количества разных двоичных форматов данных.
  • Данные в текстовом формате (стандарт XML — Unicode) проще, чем двоичные, хранить на различных платформах и безопаснее (с точки зрения отсутствия вредоносного двоичного кода) передавать в сетях. Целое направление в разработке приложений — XML Web-службы.

Well — formed XML — такой код XML , который соответствует требованиям синтаксиса этого языка (например, каждому открывающему тегу соответствует закрывающий тег). Valid XML — корректный с точки зрения логической структуры этого языка (например, элементы правильно вложены друг в друга), определенной в DTD или XML Schema .

Немного по терминологии XML, которая будет использоваться в этом курсе:

· XSD — XML Schema Definition , обычно используемое в VS . NET описание структуры документа XML. Обычно она размещается в файлах с расширением *.xsd. Внутри схемы используются специальные теги xsd . >. Каждый элемент, помеченный таким префиксом, относится к XML Schema. Внутри XML Schema можно использовать пространства имен. Например, чтобы указать, что внутри схемы используются два пространства имен, относящихся к W 3 C XML Schema и Microsoft Office 10 Data Schema , можно использовать тег

Чтобы внутри схемы определить строковый элемент Las t Name, который может встречаться в документе 0 или больше раз, можно, например, использовать следующий тег:

· для описания преобразований XML -совместимых документов используются документы на специальном языке программирования XSLT (eXtensible Stylesheet Language Transform). Сам этот язык, конечно, также является XML -совместимым. В XSLT используется три типа документов:

o документ-источник (source document). Этот документ XML «подается на вход» для преобразования. В нашем случае этот может быть такой документ:

o документ таблицы стилей XSLT (XSLT style sheet document) — XML-совместимый документ, в котором описываются правила проведения трансформаций. В нашем случае пример этого документа может быть таким:

o документ — результат преобразований. Например, при применении нашего преобразования имя сотрудника будет помечено красным, а его должность — синим.


· XPath — специальный язык, который можно использовать для навигации по дереву элементов XML . При использовании объектной модели XPath документ XML представляется в виде дерева узлов. Информация содержится в свойствах этих узлов.

· DOM ( Document Object Model ) — представление дерева документа XML в оперативной памяти. DOM позволяет выполнять навигацию по документу XML и редактировать его. Стандартные свойства, методы и события DOM определены в документе, принятом W3C. В ASP.NE T при помощи DOM можно создать документ XML и отправить его в броузер пользователю. Другой вариант — клиентский скрипт создает при помощи DOM документ XML на клиенте и передает его на Web-сервер.

· XQuery — это специализированный язык запросов к информации, которая хранится в документах XML . Работа XQuery во многом основана на XPath.

Надо сказать, что XML — это стандартный формат для работы с данными в ADO.NET. Про формат XML и как его можно использовать с DataSet — ниже.

Возможности использования XML при работе с DataSet такие:

· DataSet могут сериализовать данные в формате XML. Схема DataSet (включая таблицы, столбцы, типы данных и ограничения) определяется при этом в XML Schema (файл . xsd ).

· обмен данными из DataSet с удаленными клиентами предписывается производить в формате XML;

· XML можно использовать для синхронизации и преобразования данных в DataSet.

Еще немного про взаимодействие XML и DataSet:

· можно не только создавать XML Schema на основе DataSet (о чем говорилось выше, это делается при помощи метода WriteXmlSchema ), но и наоборот — генерировать DataSet на основе информации их XML Schema (для этого — метод ReadXmlSchema ). Есть возможность сгенерировать DataSet даже без схемы — просто на основе документа XML. Для этой цели предназначен метод InferXmlSchema.

· для объекта DataSet предусмотрен метод ReadXML, который позволяет считать текстовый документ XML (поток текстовых данных XML ) в DataSet . Другой метод, WriteXML, позволяет сохранять содержимое DataSet в XML-совместимом формате. Такая возможность позволяет очень просто организовывать обмен данными между различными приложениями и платформами.

· вы можете создать представление XML (объект Xml DataDocument ) на основе информации из DataSet . Получается, что с информацией в DataSet можно работать двумя способами: обычными реляционными (с самим DataSet) и XML-методами. Оба представления автоматически синхронизируются (при внесении изменений через любое представление).

· вы можете применять преобразования XSLT к данным, которые хранятся в DataSet .

Теперь — о том, как все это выглядит на практике.

Считать информацию из файла XML в DataSet можно при помощи кода вида

Dim ds As New DataSet()

Метод MapPath для специального объекта Server позволяет преобразовать виртуальный путь к файлу в Web-приложении в физический путь.

Будет ли сгенерирована структура DataSet автоматически из файла XML или она останется прежней, зависит от того, была ли она уже сформирована в этом DataSet и от того, был ли указан необязательный параметр метода ReadXml XmlReadMode.

Сохранить информацию из DataSet в XML-совместимом формате можно так:

Dim ds As New DataSet()

Dim da As New SqlDataAdapter( _

«select * from Authors», conn)

Есть еще два метода, которые позволяют получить из DataSet данные в формате XML и положить их в строковую переменную. Это методы GetX ml и GetXmlSchema. Пример может выглядеть так:

В DataSet часто помещаются объекты DataTable , связанные между собой отношениями DataRelation (то есть таблицы с Primary и Foreign key). При экспорте в XML информация из родительской таблицы может быть дополнена информацией из подчиненной таблицы. Записи из подчиненной таблицы будут выглядеть как вложенные элементы для записей из главной. Чтобы реализовать такую возможность, необходимо для объекта DataRelation в DataSet для свойства Nested установить значение True (по умолчанию False).

предположим, мы просто экспортируем данные без использования этого свойства:

Dim ds As New DataSet()

’fill the DataSet

Мастер Йода рекомендует:  Подготовка сайта к раскрутке (15 шагов)

Dim parentCol As DataColumn = _

Dim childCol As DataColumn = _

Dim dr As New DataRelation _

(«TitlePublishers», parentCol, childCol)

XMLElement атрибутов игнорируются Microsoft.AspNet.Mvc.Formatters.Xml

Я возвращаю объект как XML в контроллере asp.net 5. Объект имеет свойство , которое представляет собой список , и мне нужен сериализатор игнорировать корневой элемент списка. Я следовал предложение этого Пост Использование XML — сериализации сериализовать коллекцию без родительского узла , но по какой — то причине он не работает, даже игнорирует , если я пытаюсь изменить его название , используя [XmlElement ( «NEWNAME»)]

Любые подсказки, почему это может быть, что делать?

И выход я получаю

И то, что я хочу

Таким образом, проблема была форматировщик, что я использовал, я имел в Startup.cs

и нужно использовать XML сериалайзер

Это может быть так, как вы сериализации данных. Пытаться

Пространства имен XML в ASP.NET Web API

В настоящее время я работаю над проектом, который требует от меня вывода XML с его конечных точек вместе с JSON. У меня есть следующая модель:

Вывод будет следующим, если успех не равен нулю:

Теперь я вижу, что у меня нет префикса, назначенного пространству имен, в которое я указывал элементам. Моя проблема в том, что я не могу найти место для добавления префиксов пространства имен в MVC4 с помощью средства форматирования мультимедиа. В моем global.asax есть следующее:

Я создал собственный сериализатор на основе XmlSerializer, пытаясь перехватить запрос на запись и добавить туда список пространств имен. Проблема с этим методом заключается в том, что прямо сейчас у меня есть точки останова внутри каждого переопределяемого метода, и ни одна из них не отключается при сериализации, что приводит меня к мысли, что мой сериализатор не используется.

Есть ли какие-то встроенные средства для выполнения того, что я хочу сделать, или я застрял, повторно реализуя XmlMediaTypeFormatter для передачи в пространства имен при сериализации объектов?

1 ответ

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

Форматировщик работает, показывая XmlSerializerNamespaces , что XmlSerializer собираюсь использовать. Таким образом, я могу добавлять произвольные пространства имен по мере необходимости.

Моя топ-модель выглядит следующим образом:

В моем Global.asax я добавил следующее, чтобы разместить мой форматер в верхней части списка:

После добавления средства форматирования и проверки правильности моих атрибутов мой XML был правильно распределен по пространству имен.


Использование XML совместно с SQL

Часть 2. MS SQL Server 2000 в качестве Web-службы


Автор: Алексей Ширшов
Источник: RSDN Magazine #1-2004

Опубликовано: 03.10.2004
Исправлено: 10.12.2020
Версия текста: 1.0

Предисловие

Эту статью я собирался написать очень давно. Около года прошло с момента появления первой части «Использование XML совместно с SQL», а это – очень большой срок для современной IT-индустрии. Сейчас уже доступна первая бета новой версии SQL Server-а под кодовым названием «Yukon». В нем будет просто сумасшедшее количество нововведений, связанных с XML (и не только), одним из которых является возможность напрямую обращаться к серверу через Internet. Как вы знаете, в текущей версии это невозможно: взаимодействие с сервером происходит через специальное ISAPI-расширение, которое является частью пакета SQLXML. Вообще, по сравнению с Yukon (или Oracle9i), поддержка XML в SQL Server 2000 очень слаба. По существу, она ограничивается двумя конструкциями: FOR XML и OPENXML. Вся остальная функциональность реализуется с помощью SQLXML[1]. Все, что предоставляет SQLXML, как-то: шаблоны, запросы в URL, запросы XPath в конечном счету превращаются в ту или иную форму SQL-запроса, вида:

Вызов хранимых процедур и функций через Internet – также целиком и полностью заслуга SQLXML: с помощью ISAPI-расширения он перехватывает SOAP-запросы, транслирует их в вызовы соответствующих функций и процедур SQL Server-а и возвращает результат в виде XML. Трансформация выбранного recordset-а в XML происходит на основе информации конфигурационного файла (расширение ssc), но обо всем по порядку.

Настройка IIS

Для того чтобы стал возможен вызов хранимых процедур и функций как Web-методов, необходимо создать и настроить виртуальную директорию Internet-сервера. Это выполняется с помощью консоли «IIS Virtual Directory Management for SQLXML 3.0». Я не буду рассматривать все шаги этого процесса, так как для всех типов запросов (soap, templates, dbobject и schema) он одинаков. Подробную информацию об этом можно получить из документации по SQLXML 3.0 и в [1]. Рассмотрим лишь, как настроить запросы типа soap. На рисунке 1 приведен пример.

Рисунок 1. Создание Web-сервиса.

Здесь имя виртуальной директории – «srv». Имя Web-сервиса – webserv, тип директории – soap, имя хоста – dcit06. Кроме этого, необходимо указать физический путь до папки, где будут располагаться конфигурационный файл и файл описания Web-сервиса. После того, как вы нажмете кнопку «Save», SQLXML создаст wsdl-файл, в котором будет содержаться описание Web-сервиса, и конфигурационный файл ssc, в котором будут содержаться описания всех Web-методов и их параметров. Файл ssc предназначен только для внутренних служебных нужд SQLXML, его формат нигде не описан и в любой момент может измениться.

На вкладке Settings не забудьте поставить галочку напротив опции «Allow POST».

Содержание wsdl-файла

WSDL – это специальный формат, предназначенный для описания Web-сервисов, их методов, параметров и используемых протоколов. Это обычный XML-документ с корневым тегом definitions, содержащий описания типов, параметров, операций, протоколов и сервисов. Они подробно будут описаны далее. SQLXML генерирует файл в формате WSDL 1.1, который имеет статус ноты (как и SOAP 1.1).

Reads any inline schema and loads the data. If the DataSet already has a schema, new tables may be added to the schema but an exception is thrown if any tables in the inline schema already exist in the DataSet.

ПРИМЕЧАНИЕ

Если вы не знакомы с терминологией наименования этапов обработки документов консорциума w3c, рекомендую ознакомиться с документом https://www.w3.org/Consortium/Process.

В данный момент уже практически завершается работа по созданию спецификации WSDL 1.2. Более подробную информацию можно получить по адресу https://www.w3.org/2002/ws.

Файл WSDL условно можно поделить на две части: абстрактную и конкретную часть. Первая описывает типы, параметры и операции и не касается конкретных протоколов и конечных точек (endpoints) или сервисов. WSDL предназначен не только для работы по протоколу SOAP, так что описание конкретного транспорта выделается в отдельные, конкретные элементы, описание которых находится в второй части WSDL файла. Рассмотрим по порядку фрагменты абстрактной и конкретной частей, которые далее в статье будут называться секциями.

Секция types

Эта секция содержит набор схем в формате XML Schema, каждая из которых описывает абстрактные типы, не зависящие от какого-либо языка или машины. Эта секция не является обязательной и может быть опущена, если Web-сервис не нуждается в дополнительных типах (как правило, это составные типы – complex types) и вполне обходится стандартными, определенными в XML Schema.

SQLXML определяет четыре схемы типов:

https://schemas.microsoft.com/SQLServer/2001/12/SOAP/types. Эта схема описывает базовые типы, используемые при построении сообщений.

Простой тип nonNegativeInteger – целочисленный тип без знака в диапазоне от 0 до 2147483647.

Атрибут IsNested булевого типа.

Сложный тип SqlRowSet – используется в случае, когда результирующее сообщение имеет тип DataSet object. Более подробно о типах результирующих сообщений см. раздел «Создание Web-методов».

Сложный тип SqlXml – используется в случае, когда результирующее сообщение имеет тип XML objects.

Простой тип SqlResultCode — целочисленный тип без знака в диапазоне от 0 до 2147483647, который используется для описания возвращаемого хранимой процедурой значения.

https://schemas.microsoft.com/SQLServer/2001/12/SOAP/types/SqlMessage. Эта схема определяет единственный тип, который описывает сообщение от SQL Server-а в случае ошибки.

Сложный тип SqlMessage – содержит поля для описания кода ошибки, номера строки, строкового представления ошибки и других параметров.

https://schemas.microsoft.com/SQLServer/2001/12/SOAP/types/SqlResultStream. Эта схема определяет единственный сложный тип, который описывает любой ответ от сервера.

Сложный тип SqlResultStream – содержит одно и более вхождений полей следующих типов: SqlRowSet, SqlXml, SqlMessage и SqlResultCode.

Пространство имен конкретного Web-сервиса, которое импортирует все вышеперечисленные пространства имен и описывает типы, необходимые конкретным Web-методам. В данный момент эта схема не содержит ни одного описания, так как пока Web-сервис не определил каких-либо Web-методов.

В качестве примера приведу фрагмент WSDL-файла, сгенерированного при создании виртуальной директории.

Секция message

Эта секция содержит описания параметров Web-методов. В текущем WSDL-файле ее нет, так как мы пока еще не определили никакого метода. Вообще, секция message состоит из набора частей (parts), каждая из которых описывает конкретный параметр. Часть может быть и одна, в этом случае используется несколько отличный синтаксис, при котором задается конкретный элемент части, вместо перечисления нескольких типов. Ниже приведен пример одинаковых параметров.

В SQLXML принят последний стиль описания параметров, так как в нем используется документ-литеральная форма SOAP-сообщений. О формах сообщений мы поговорим чуть позже.

Секция portType

Последняя секция, где описываются абстрактные параметры Web-сервиса. Эта секция является обязательной и содержит неопределенное количество необязательных разделов operation. Операции описывают конкретные Web-методы. Так как у нас пока нет Web-методов, то и количество разделов operation равно нулю.

У каждой операции есть имя и набор входных, выходных и ошибочных параметров, представленных элементами input, output и fault соответственно. Входные и выходные параметры могут образовывать различные типы операций: запрос/ответ, запрос, ответ и ответ/запрос. Это достигается с помощью соответствующей комбинации элементов input и output. Например, следующий псевдофрагмент описывает схему взаимодействия запрос/ответ (вопросительный знак обозначает необязательность элемента, звездочка – неопределенное количество элементов):

Формы сообщений

Спецификация SOAP старше WSDL. На момент ее разработки и утверждения у программистов не было механизмов описания Web-сервисов, которые можно было бы использовать без предварительного изучения протокола. Для обхода этой проблемы спецификация SOAP определяет специальный формат обмена сообщениями, известный как RPC/encoded. RPC – определяет форму сообщения, а encoded – методы сериализации данных в тело SOAP-сообщения. Encoded сериализация подробно описана в разделе 5 спецификации [6].

С выходом WSDL появилась возможность описывать формат сообщений с помощью XML Schema. Эта форма получила название document/literal. Document означает, что тело SOAP-сообщения может и не представлять собой вызов метода. Это может быть просто набор элементов, соответствующих какому-либо бизнес-документу. Literal означает, что формат сообщения полностью определяется секцией types, т.е. схемой документа. Никаких особых правил, как в случае encoded сериализации, здесь не применяется.

Возможны также и комбинации этих форматов: RPC/literal, document/encoded. Рассмотрим их по порядку.

RPC-стиль подразумевает, что сообщение содержит только один элемент верхнего уровня (непосредственный дочерний элемент SOAP:Body), название которого соответствует имени удаленного метода. Имя метода определяется именем элемента operation секции portType WSDL-документа. Пространство имен этого элемента определяется значением атрибута namespace элемента связывания SOAP:Body. Каждый вложенный в него элемент представляет параметр метода, имя которого определяется именем части в секции message WSDL-документа. Таким образом, частей может быть несколько, так как их количество равно количеству параметров метода. Элемент, представляющий параметр, должен быть неквалифицированным, т.е. не должен принадлежать никакому или пустому пространству имен. Содержимое элементов, представляющих параметры, определяется типом сериализации: encoded или literal.

Document стиль определяет, что сообщение будет в точности соответствовать схеме, описанной в разделе types. Количество элементов верхнего уровня может быть любым. Имя элемента верхнего уровня определяется схемой, а не именем операции, как в RPC-стиле. Количество частей, ссылающихся на тип в разделе message – не более одной. Если часть ссылается на элемент, их может быть несколько. Содержимое элементов, представляющих параметры, определяется типом сериализации: encoded или literal.

Encoded-сериализация слишком сложна и объемна для этой статьи. Интересующихся отсылаю к разделу 5 спецификации [6]. Что касается WSDL-документа, то используя этот тип сериализации, вы не можете указывать конкретных элементов в части секции message. Т.е. допустим только синтаксис указания типа.

Тело SOAP сообщения

Literal-сериализация намного проще encoded, так как содержимое документа определяется только схемой. Части сообщения могут быть представлены либо одним типом, либо набором элементов. В первом случае, само содержимое элемента soap:body кодируется в соответствии с типом части, а во втором случае – тело SOAP-сообщения содержит набор описанных элементов.

Создание страниц ASP.NET в среде Visual Studio

Среда Visual Studio существенно облегчает разработку Web-приложений. Основными действиями, выполняемыми в ходе создания приложения в среде, являются создание форм, написание обработчиков событий, добавление файлов (таблиц стилей, страниц и т.п.), отладка

В Visual Studio разных версий предлагается несколько режимов создания Web-приложений, функционирующих на основе ASP.NET, чаще всего используются Website… и Project… В Visual Studio 2005 включен только Website…, в 2008 и 2010 – оба.


В режиме создания Web-сайта (File — New Website…). Visual Studio создает только файлы, относящиеся к сайту (файл с кодом страницы, файл с программами обработчиков и файл конфигурации).

В окне New Web Site могут быть дополнительно указаны параметры: версия .NET, шаблон (выбираем ASP.NET WEB Site), размещение (место хранения файлов Web-сайта), язык программирования. После того, как выбор сделан (нажата ОК) будет создана заготовка Web-приложения (три основных файла). Компиляция страниц будет выполняться средой ASP.NET перед открытием в браузере.

В режиме создания проекта (File — New Project…) кроме основных файлов, генерируется несколько вспомогательных и файл проекта с расширением .csproj, в котором фиксируются составляющие проект файлы и сохраняются некоторые отладочные параметры.

В окне New Project кроме типа (ASP.NET Web Application), места размещения и языка, необходимо выбрать имя (Solution Name), которое затем будет использовано для создания в выбранном месте размещения соответствующего подкаталога.

В отличие от режима создания Web Site, кроме размещения информации в различных файлах, при запуске Web-проекты компилируются Visual Studio (а не ASP.NET). Классы Web-страниц объединяются в одну сборку, которая получает то же имя, что и у Web-проекта (например, WebApplication) и затем размещается в папке bin. В Web-проекте для страниц всегда используют модель отделенного кода, объявления для всех элементов управления содержаться в файле с расширением .aspx.desginer.cs. Во время компиляции файлы с кодами обработчиков и кодами элементов управления будут объединены. В беспроектном Web-сайте файла с объявлениями элементов управления нет, поскольку эта часть кода генерируется во время компиляции системой ASP.NET. Есть и другие отличия (например, в содержании директивы Page и т.п.), останавливаться на которых мы не будем.

Дальнейшие действия по созданию Web-приложения практически не отличаются.

В ходе работы по созданию сайтов используются окна и панели, состав и место расположения которых можно изменять, используя меню View и перетаскивая их мышью. Типичный вид среды при разработке Web-приложений приведен на рис.4.4.

Рис. 4.4. Вид окна для разработки Web-приложений

Панели инструментов, содержат различные команды для форматирования текста, поиска текста и т.д.

Обозреватель решений, отображает файлы и папки веб-узла.

Окно документов обеспечивает отображение документов в различных представлениях и служит визуализированным редактором форм.

Окно Свойств отображает параметры страницы, элементов HTML, элементов управления и других объектов, а также позволяет изменять их.

Панель элементов содержит элементы управления и HTML-элементы, которые можно размещать на страницах.

Обозреватель серверов (баз данных) отображает подключения различных служб компьютера, в том числе серверов баз данных.

Окно вывода служит для вывода сообщений среды (ошибки, информация отладчика и т.п.).

Создание форм. Создаваемые документы (формы и файлы с программным кодом) открываются в окне документов. При работе с формами предусмотрено два режима отображения Design и Source. В первом режиме интерфейс можно конструировать визуально, во втором – путем написания кода разметки. Для переключения используются закладки в нижней части окна. В режиме Design можно повысить наглядность отображаемой структуры, выполнив команду Details из меню View.

Форма ASP.NET – документ, на основе которого формируется HTML-страница, отправляемая клиенту. Она создается путем размещения элементов в окне документов. Элементы для размещения выбираются из панели инструментов. В панели элементы сгруппированы по типам.

Чаще всего используются элементы из групп HTML и Standard.

Группа HTML содержит HTML-элементы, соответствующие одноименным элементам обычных Web-страниц. С их использование создается статическая разметка страницы. Однако они могут быть преобразованы в серверные путем добавления атрибута runat=»server» или выполнения команды Run As Server Control из контекстного меню элемента. Их называют серверными HTML-элементами управления, при их обработке перед отправкой формируется только один HTML-тег.

Группа Standard содержит серверные элементы управления с расширенной функциональностью. Среди них имеются полнофункциональные элементы управления, выполняющие генерацию достаточно сложного HTML-кода и клиентских сценариев JavaScript для создания развитого интерфейса на клиенте. Это такие элементы как Calendar, AdRotator, TreeView. Среди них есть и аналоги HTML-элементов (кнопок, текстовых полей и т.д.). Элементы этой группы называют серверными Web-элементами управления, они являются основными при создании форм.

Среди других групп отметим такие.

Login — элементы управления входом в систему. Эти элементы управления поддерживают аутентификацию пользователя, их можно использовать вместо написания своих собственных интерфейсов для входа в систему и создания новых пользователей.

Navigation — элементы управления навигацией. Они позволяют пользователю перемещаться с одной страницы на другую, отображают карту сайта и др.

Validation — элементы управления проверкой правильности заполнения полей пользователем.

Data — элементы управления данными.

После размещения элемента имеется возможность задания его свойств с помощью окна свойств. Элемент необходимо выделить, в окне отобразятся его свойства, которые можно изменять.

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

В обработчиках можно задать реакцию на действия пользователя, изменять свойства элементов, динамически создавать элементы.

Создадим страницу для ввода анкеты с данными пользователя при первом обращении, и выводом сообщения о состоявшейся регистрации при последующих обращениях. Часть элементов для ввода данных создадим динамически.

Using XML in ASP.NET

XML is a cross-platform, hardware and software independent, text based markup language, which enables you to store data in a structured format by using meaningful tags. XML stores structured data in XML documents that are similar to databases. Notice that unlike Databases, XML documents store data in the form of plain text, which can be used across platforms.

In an XML document, you specify the structure of the data by creating a DTD or an XML schema. When you include a DTD in an XML document, the software checks the structure of the XML document against the DTD. This process of checking the structure of the XML document is called validating. The software performing the task of validating is called a validating parser.

The following code defines the structure of an XML document that will store data related to books:

xml version = » 1.0 » ?>
Books >
Book bid = » B001 » >
Title > Understanding XML Title >
Price > $30 Price >
author >
FirstName > Lily FirstName >
LastName >
Hicks LastName >
author >
Book >
Book bid = » B002 » >
Title > .NET Framework Title >
Price > $45 Price >
author >
FirstName > Jasmine FirstName >
LastName >
Williams LastName >
author >
Book >
Books >

.NET Support for XML

The .NET Framework has extensive support for working with XML documents. IN the .NET framework, the support for XML documents includes:

XML Web Server control

XML DOM support

XML Namespace

The System.Xml namespace provides a rich set of classes for processing XML data. The commonly used classes for working with XML data are:

XmlTextReader: Provides forward only access to a stream of XML data and checks whether or not an XML document is well formed. This class neither creates as in-memory structure nor validates the XML document against the DTD. You can declare an object of the XmlTextReader class by including the System.Xml namespace in the application. The syntax to declare an object of this class is as follows:

XmlTextReader reader = new XmlTextReader( «XML1.xml» );

It is important to note that the .xml file you pass as an argument to the constructor of the XmlTextReader class exists in the \WINNT\System32 folder.

XmlTextWriter: Provides forward only way of generating streams or files containing XML data that conforms to W3C XML 1.0. If you want to declare an object of the XmlTextWriter class, you must include the System.Xml. The syntax to decare an object of this class is as follows:

XmlTextWriter writer = new XmlTextWriter(Response.Output);

Here Response.Output represents an outgoing HTTP response stream to which you want to send the XML data.

XmlDocument: Provides navigating and edinting features of the nodes in an XML document tree. XmlDocument is the most frequently used class in ASP.NET applications that use XML documents. It also supports W3C XML DOM. XML DOM is an in-memory representation of an XML document. It represents data in the form of hierarchically organized object nodes and allows you to programmatically access and manipulate the elements and attributes present in an XML document.

XmlDocument doc = new XmlDocument();

XmlDataDocument: Provides support for XML and relational data in W3C XML DOM. You can use this class with a dataset to provide relational and non-relational views of the same set of data. This class is primarily used when you want to access the functions of ADO.NET. The syntax to declare an object of this class is as follows:

DataSet ds= new DataSet();
XmlDataDocument doc= new XmlDocument(ds);


There are a number of reasons to use XmlDataDocument:

It gives you the freedom to work with any data by using the DOM.

There is synchronization between an XmlDatadocument and a DataSet, and any changes in one will be reflected in the other.

When an XML document is loaded into an XmlDatadocument, the schema is preserved.

You need to include System.Xml namespace.

XmlPathDocument: Provides a read-only cache for XML document processing by using XSLT. This class is optimizied for XSLT processing and does not check for the conformity of W3C DOM. For this reason, you can create an instance of this class to process an XML document faster. To create an instance of the XPathDocument class, you need to include the System.Xml.XPath namespace in the application. The Syntax to declare an object of this class is as follows:

XmlPathDocument doc= new XmlPathDocument( «XML1.xml» );

XmlNodeReader: Provides forward-only access to the data represented by the XmlDocument or XmlDataDocument class. If you want to create an instance of the XmlNodeReader class, you need to include the System.Xml namespace. The syntax to declare an object of this class is as follows:

XmlDocument doc= new XmlPathDocument();
XmlNodeReader reader= new XmlNodeReader(doc);

XslTransform: Provides support for a XSLT 1.0 style sheet syntax that enables you to transform an XML document by using XSL style sheets. If you want to create an instance of the XslTransform class, you need to include the System.Xml.Xsl namespace in the application. The syntax to declare an object of this class is as follows:

Xsltransform xslt = new XslTransform ();

XML Designer

Visual Studio .NET provides the XML designer that you can use to create and edit XML documents. For example, if you need to create an XML document that contains the details of books available in an online bookstore, you need to perform the following steps by using the XML designer of Visual Studio .NET:

Create a new ASP.NET Web application.

Select the Add New Item option

Select XML File as the template from the right pane. Specify the name as «books.xml» and click open.

The XML designer is displayed. The XML designer has automatically generated a line that notifies the browser that the document being processed is an XML document, as displayed in the figure:

5. At the bottom of the designer window, there are two tabs, XML and Data. In the XML tab enter the following lines of code after the first line in the XML designer:

The Data view displays the XML data represented by the XML document. When you switch to the Data view, the data appears, as displayed in the following figure:

In addition to just viewing data in the Data view, you can also add data directly to an existing XML document. For this, just click on the new row below the existing data and enter your values, and shown in the figure:

XML Web Server Control

An XML Web Server control is used to display the contents of an XML document without formatting or using XSL Transformations. You can optionally specify a XSLT style sheet that formats the XML document before it is displayed in an XML server control. The XML Web Server control belongs to the System.Web.UI.WebControls namespace. You can add an XML Web Server control to a Web form by dragging the control from the Web forms tab of the toolbox.

The XML Web Server control has the following properties:

DocumentSource: Allows you to specify the URL or the path of the XML document to be displayed in the Web form.

TransformSource: Allows you to specify the URL of the XSLT file, which transforms the XML document into the required format before it is displayed in the Web form.

Document: Allows you to specify a reference to an object of the XMLDocument class. This property is available only at runtime.

Transform: Allows you to specify a reference to an object of the XMLTransform class. This property is available only at runtime.

A practical example for the same is shown in the last section of this tutorial.

XML Document Object Model Support

When you want to access and display XML data in Web Applications, you use the XML Web server control and set its properties at design time. In certain situation, you may need to display the XML data based on specific conditions. In such cases, you will have to access the XML data programmatically.

An XML document consists of elements and attributes. For this reason, you can access XML data programmatically. Note that XML DOM allows you to access and manipulate the elements and attributes present in an XML document programmatically.

To implement XML DOM, the .NET framework provides a set of additional classes included in the System.Xml namespace. These classes enable you to access the XML data programmatically. Some of the classes in the System.Xml namespace are as follows:

XmlDocumentType: Represents the DTD used by an XML document.

XmlElement: Represents one element from an XML document.

  • XmlAttribute: Represents one attribute of an element.
  • Bind XML Data to Web Form Controls

    An XML document cannot be directly bound to server controls. To implement data binding, you first need to load the XML document into a DataSet. Then, you can bind server control with this DataSet.

    The Dataset object has a ReadXml method, which is used to read data into the DataSet from an XML file. The ReadXml method can read XML documents from the Stream, File, TextReader, and XmlReader sources. The synatx for the ReadXml method is as follows:

    ReadXml (Stream | FileName | textReader | XmlReader , XmlReadMode )

    The XmlReadMode parameter can take any of the values listed in the following table:

    Checks the XML document and selects the action accordingly from the following choices:

    1. If the DataSet already has schema or the document contains an inline schema, it sets XmlReadMode to ReadSchema.

    2. If the DataSet does not already have a schema and the document does not contain an inline schema, it sets XmlReadMode to InferSchema.

    Reads a Diffgram, which is a format that contains both the original and the current values of the data, and applies changes from the DiffGram to the DataSet.

    The default namespace is read as the inline schema.

    Ignores any inline schema and reads data into the existing DataSet schema.

    Ignores any inline schema and instead infers schema from the data and loads the data.


    Consider that you want to represent «books.xml», with a DataSet. For this you can read the «books.xml» file into a DataSet and bind the XML document control to the DataGrid control by adding the following code to the Load event of the page in the .aspx page.

    private void Page_Load( object sender, System.EventArgs e)
    <
    DataSet ds = new DataSet();
    ds.ReadXml (MapPath( «books.xml» ));
    DataGr >
    DataGrid1.DataBind();
    >

    Working With XML Server Controls — Practical Example

    The WebShoppe Web Site needs to create a Web application to store the details of the books available for sale in the XML format. The details of the books should be displayed in a tabular format in a browser. The details include Book Id, Title, price, First Name and Last Name of the author.

    Solution: It is pertinent to note that XSLT is the W3C specification for formatting XML documents and displaying the contents in the required format. You need to create an .xsl file by using Visual Studio .NET IDE to display the data stored in the XML document in a tabular format. An XML Web server control is used to display the contents of an XML document in Web application. You need to add an XML Web Server control from the toolbox to the Web form to display the relevant XML data in the Web application.

    1. Open your Web application, and add an item XML file, in the same manner as shown before. So, now considering that you have added «books.xml» using the XML designer to your web application, let us move to next step.

    2. Select Add New Item option from the project menu to open the Add New Item dialog box.

    3. Select XSLT File as the template form the right pane.

    4. Add a few lines of code after the second line (since two lines are automatically generated). To see this code you can download the project through the link at the end of this section.

    Now that you have created the XML file with the relevant data, and also specified the style sheet for the XML file.

    5. Next, you need to apply the style sheet to the XML data by adding an XML server control to the WebForm1.aspx and setting the DocumentSource and TransformSource properties to .xml file and .xsl file respectively.

    Build your application and run it. The output should be as follows:

    You can download this application through this link.

    Converting Relational Data into an XML document

    ASP.NET allows you to easily convert the data form a database into an Xml document. It provides the XMLDataDocument class, which allows you to load relational data and the data from an XML document into a DataSet. The data loaded in XMLDataDocument can be manipulated using the W3C DOM.

    Let us consider a problem: you need to extract data from a SQL Server and store it as an XML file.

    Solution: For this we’ll add an XML Web server control and a label to display ant error message. The code for the same is written below:

    Create XML sitemap dynamically in ASP.NET MVC C#

    Whenever you create any web-based application you need to submit the Sitemap of that website links/Url to Google Webmasters so that Google bot can crawl it and other internet users can find using Google search engine. So, here in this post, I am going to explain to you how you can create XML dynamically in ASP.NET MVC C# web application.

    Step 1: Create a Project in Visual Studio

    Open our Visual Studio IDE, create a new project, by navigating to «File»-> «New»-> «Project».

    Select «Web» in the left pane and «ASP.NET Web application» in the right pane, provide a name for your web application(In my example it’s «XMLSitemapProject»), Click «OK».

    Step 2: Create the Helper Folder and Helper classes

    To make sure everything work’s fine we would need some helper methods, so first, create a new folder in your project with Name «Helper».

    First Helper would be to check Regex of the URL while generating Slug, so let’s create a Class with name RegexUtils.cs and add the code below in it

    Second helper method would be to Extend StringExtensions in our app, which helps us to validate String value is null or not and generate Slug URL for us with the help of above create Regex, so let’s add a new .cs file with name StringExtensions

    Above code is mostly explained with the help of Comments.

    Now, Add one more class named as PathUtils, which will help us combine paths, so here is the code for it

    That’s it, we are done with the helper class.

    Step 3: Generate Model and interface for Sitemap

    We definitely need some models to generate dynamic XML using C#, so create an Interface first, let’s name it ISitemapItem, in which we will add all the properties of the XML node, required to create Sitemap node.

    A Sitemap node looks like this

    So the interface code would be as below

    Create another Interface with name ISitemapGenerator.cs

    Now we would need an Enum Class which will help us define Change frequency of Sitemap, so let’s create Enum for it.

    We have all the Interface defined now, let’s add the Class which defines the XML node details ( SitemapItem .cs ) which Inherit Interface ISitemapItem

    We have all the classes and helper method, let’s use it to generate the XML sitemap and its node by creating a class ( SitemapGenerator.cs )

    That’s it, we are done with our main XML generator method.

    Finally, we would need a Class which extends ActionResult and give’s us XML directly by calling Action of Controller, so create a SitemapResult.cs as below

    Step 4: Create a Controller which returns XML when calling its ActionMethod call

    Let’s create a Controller call it SitemapController, right click on your projects Controller Folder, Select «Add», then select «Controller», name it(SitemapController) and click «Ok»

    and use the below code

    the above method directly returns us the sitemap, so build your project, run it in the browser and Navigate to URL «https://localhost:57630/sitemap», you will see the output as below

    That’s it, we have the sitemap, I have referenced file from here but you can still proceed further if you want to create a separate XML file

    Step 5: Create a Sitemap XML file and Add nodes in it dynamically

    If your site is static or doesn’t change a lot & you needed to generate sitemap XML for only one time using C#, then above method is fine, but what if you need a separate sitemap.xml file and you want to add more nodes in sitemap regularly as soon as new a web-page is added dynamically in your application, which you want Google to index? So, for that, we need to do some more changes.

    Go to your Sitemap controller and add the code below to first generate sitemap’s basic nodes and create a separate XML file for it

    Build your project and navigate to URL «https://localhost:57630/sitemap/GenerateSiteMap», it will redirect your to Home page of the application, but in your project’s root folder you can see a new file get’s added with name «Sitemap.xml», as shown below

    now, the last part for adding nodes dynamically, let’s create another ActionMethod in your controller to add a sitemap node

    Build your project and navigate to URL «https://localhost:57630/sitemap/AddNewSitemapElement», it will return to home page but now open the already created «Sitemap.xml» file in your root folder of the project, it should have new node added just before the last node.

    so our new node got added as required, that’s it, feel free to ask any questions related to this article in question’s section or comment below.


    Использование XSLT-шаблонизатора в ASP.NET MVC

    Сейчас при разработке широко используется шаблон MVC, подразумевающий разделение модели данных, представления и логики работы. Довольно известная реализация этого шаблона в web-разработке — ASP.NET MVC Framework. Не так давно вышла третья версия этого фреймворка, в которой есть два варианта реализации представлений: ASPX и Razor. Оба движка имеют достаточно широкий набор возможностей, но в этой публикации я попробую описать использование другого средства для реализации представлений — XSLT-шаблоны.

    XSLT-шаблон — это XML-документ, описывающий преобразование одного или нескольких входных XML-документов в выходной, который обычно также является XML или HTML-документом. В нашем случае входными данными для шаблона будет XML-представление данных, полученных из соответствующих моделей. Переданные в шаблон данные используются для формирования контента страницы.
    Основной проекта нам послужит шаблон ASP.NET MVC 3 Application. Выбираемый View Engine здесь значения не имеет.

    Модели данных

    Для всех моделей, передаваемых в представления, опишем следующий базовый класс:

    [ Serializable ]
    [XmlInclude( typeof (UserModel))]
    public abstract class XmlModel < >

    Первый атрибут нужен, поскольку объекты этого класса будут сериализованы в XML. О причинах использования второго атрибута будет сказано ниже.
    UserModel — пример дочернего класса, который мы будем передавать в представление:

    [ Serializable ]
    public class UserModel : XmlModel
    <
    [ XmlAttribute ]
    public int User >get ; set ; >

    public string Login < get ; set ; >
    public string Email < get ; set ; >
    >

    Теперь опишем основной класс, который будет сериализовываться и передаваться в шаблон:

    [ Serializable ]
    public class Result
    <
    [ XmlAttribute ]
    public string Controller < get ; set ; >
    [ XmlAttribute ]
    public string Action

    Свойства класса содержат информацию о текущем контроллере, действии, а также список переданных контроллером моделей данных.
    Поскольку в список Data будут добавляться не объекты XmlModel, а объекты дочерних классов, то для успешной сериализации этого поля и нужен был атрибут XmlInclude при описании класса XmlModel.
    Структура XML-документа после сериализации будет следующей:

    Result Controller =»SomeController» Action =»SomeAction» >
    Data >

    Data >
    Result >

    Контроллеры

    Обычно действия контроллера возвращают результат типа ActionResult. Подходящей реализации этого класса найти не получилось, поэтому я описал свою. Конструктор нашего класса будет принимать строку c XML-данными, передаваемыми в шаблон:

    private string _data;
    public XmlResult( string data)
    <
    _data = data;
    >

    Основной метод, который нужно реализовать — ExecuteResult. Он формирует ответ клиенту. В нём мы и будем обрабатывать шаблон представления:

    public override void ExecuteResult(ControllerContext controllerContext)
    <
    var xslTransform = new XslCompiledTransform();

    //загружаем исходный шаблон
    var controller = controllerContext.RouteData.Values[ «controller» ] as string ;
    var action = controllerContext.RouteData.Values[ «action» ] as string ;
    var templatePath = string .Format( «

    /Views/<0>/<1>.xsl» , controller, action);
    var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile(templatePath);
    //также возможно использование единого главного шаблона:
    //var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile(«

    /Views/default.xsl»);
    var xmlReader = XmlReader.Create(virtualFile.Open());
    xslTransform.Load(xmlReader);
    xmlReader.Close();

    var stringReader = new StringReader (_data);
    xmlReader = XmlReader.Create(stringReader);

    //обработка XML-данных в шаблоне и передача их в http-ответ клиенту
    var xmlWriter = XmlWriter.Create(controllerContext. HttpContext .Response.OutputStream);
    xslTransform.Transform(xmlReader, xmlWriter);

    stringReader.Close();
    xmlReader.Close();
    xmlWriter.Close();
    >

    В итоге получается следующий класс:

    public class XmlResult : ActionResult
    <
    private string _data;

    public XmlResult( string data)
    <
    _data = data;
    >

    public override void ExecuteResult(ControllerContext controllerContext)
    <
    var xslTransform = new XslCompiledTransform();

    //загружаем исходный шаблон
    var controller = controllerContext.RouteData.Values[ «controller» ] as string ;
    var action = controllerContext.RouteData.Values[ «action» ] as string ;
    var templatePath = string .Format( «

    /Views/<0>/<1>.xsl» , controller, action);
    var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile(templatePath);
    //также возможно использование единого главного шаблона:
    //var virtualFile = HostingEnvironment.VirtualPathProvider.GetFile(«

    /Views/default.xsl»);
    var xmlReader = XmlReader.Create(virtualFile.Open());
    xslTransform.Load(xmlReader);
    xmlReader.Close();

    var stringReader = new StringReader (_data);
    xmlReader = XmlReader.Create(stringReader);

    //обработка XML-данных в шаблоне и передача их в http-ответ клиенту
    var xmlWriter = XmlWriter.Create(controllerContext. HttpContext .Response.OutputStream);
    xslTransform.Transform(xmlReader, xmlWriter);

    stringReader.Close();
    xmlReader.Close();
    xmlWriter.Close();
    >
    >

    Теперь займёмся написанием базового класса контроллера.
    Для начала переопределим поле ViewData, в которое будем добавлять данные:

    public new List ViewData = new List ();

    Теперь опишем новый метод View, который будет возвращать объект ActionResult из контроллера. Он выполняет сериализацию наших данных и передаёт их в конструктор описанного выше класса:

    public new ActionResult View()
    <
    //сериализаем исходные данные
    var result = new Result
    <
    Controller = ControllerContext.RouteData.Values[ «controller» ] as string ,
    Action = ControllerContext.RouteData.Values[ «action» ] as string ,
    Data = ViewData
    >;
    var xmlSerializer = new XmlSerializer( typeof (Result));
    var stringWriter = new StringWriter ();
    xmlSerializer.Serialize(stringWriter, result);
    stringWriter.Close();
    //передаём их в новый ActionResult
    return new XmlResult(stringWriter.ToString());
    >

    В конечном итоге получим такой класс:

    public abstract class XsltController : Controller
    <
    public new List ViewData = new List ();

    public new ActionResult View()
    <
    //сериализаем исходные данные
    var result = new Result
    <
    Controller = ControllerContext.RouteData.Values[ «controller» ] as string ,
    Action = ControllerContext.RouteData.Values[ «action» ] as string ,
    Data = ViewData
    >;
    var xmlSerializer = new XmlSerializer( typeof (Result));
    var stringWriter = new StringWriter ();
    xmlSerializer.Serialize(stringWriter, result);
    stringWriter.Close();
    //передаём их в новый ActionResult
    return new XmlResult(stringWriter.ToString());
    >
    >

    Теперь сделаем простейший контроллер на основе этого класса:

    public class HomeController : XsltController
    <
    public ActionResult Index()
    <
    var user = new UserModel < User >«root» , Email = «noreply@localhost» >;
    ViewData.Add(user);
    return View();
    >
    >

    Он передаёт в представление информацию о пользователе. В итоге в шаблон поступает следующий XML:

    xml version =»1.0″ encoding =»utf-16″ ? >
    Result xmlns:xsi =»https://www.w3.org/2001/XMLSchema-instance» xmlns:xsd =»https://www.w3.org/2001/XMLSchema» Controller =»Home» Action =»Index» >
    Data >
    XmlModel xsi:type =»UserModel» UserId =»1″ >
    Login > root Login >
    Email > noreply@localhost Email >
    XmlModel >
    Data >
    Result >

    Представление

    Теперь опишем простой XSLT-шаблон, в котором показан пример использования переданных данных:

    xml version =»1.0″ encoding =»utf-8″ ? >
    xsl:stylesheet version =»1.0″ xmlns:xsl =»https://www.w3.org/1999/XSL/Transform» xmlns:xsi =»https://www.w3.org/2001/XMLSchema-instance» >
    xsl:output encoding =»utf-8″
    method =»xml»
    media-type =»application/xhtml+xml»
    doctype-public =»-//W3C//DTD XHTML 1.1//EN»
    doctype-system =»https://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd» />
    xsl:template match =»/» >
    html xmlns =»https://www.w3.org/1999/xhtml» >
    head >
    meta http-equiv =»Content-Type» content =»application/xhtml+xml; charset=utf-8″ />
    title > XSLT + MVC title >
    head >
    body >
    p > Controller: xsl:value-of select =»/Result/@Controller» /> p >
    p > Action: xsl:value-of select =»/Result/@Action» /> p >
    p > User: xsl:value-of select =»//XmlModel[@xsi:type = ‘UserModel’]/Login» /> p >
    body >
    html >
    xsl:template >
    xsl:stylesheet >

    В результате получаем в браузере нужный нам HTML-код:

    xml version =»1.0″ encoding =»utf-8″ ? >
    html xmlns =»https://www.w3.org/1999/xhtml» xmlns:xsi =»https://www.w3.org/2001/XMLSchema-instance» >
    head >
    meta http-equiv =»Content-Type» content =»application/xhtml+xml; charset=utf-8″ />
    title > XSLT + MVC title >
    head >
    body >
    p > Controller: Home p >
    p > Action: Index p >
    p > User: root p >
    body >
    html >

    Таким образом, извлекая нужные нам данные из моделей, мы передаём их в представление, где с их помощью формируется нужная нам страница. Используя атрибуты Controller и Action корневого тега, можно реализовывать требуемое поведение шаблона для различных контроллеров и действий.

    * This source code was highlighted with Source Code Highlighter .

    Преобразование XElement в XmlElement для преобразования XSLT-ASP.NET C #

    Я работаю над проектом, который требует от меня, чтобы загрузить документ XML в XSLT и преобразовывать его для отображения в HTML-таблице. Проблема заключается в том, что, поскольку я использую LINQ для создания XML, все теги элемента XElement теги, так: свойство «XSL стоимость отборных» обыкновение читать XElement. Я интересно, если есть способ, чтобы преобразовать XElement в XmlElement или просто XSLT прочитать XElements вместо XMLElements?

    Вот код, где я загрузить данные в файл XML с помощью LINQ:

    Вот код для моего XSLT:

    Таким образом, сейчас все, что нагрузки являются заголовки, поскольку «XSL: для-каждого» также не работает.

    Любая помощь будет принята с благодарностью.

    Просто используйте : your.xDocument.CreateNavigator() и передать результат в качестве параметра для Transform() метода XslCompiledTransform .

    Вот пример того, как именно это сделать :

    В этом примере получается следующий результат :

    Мастер Йода рекомендует:  Простые, но эффективные советы по кросс-браузерной вёрстке, которые должен знать каждый
    Добавить комментарий