XML преобразование – масштабируемы ли вы настолько, насколько могли бы быть?
Автор: Tiberius OsBurn
[Оригинал статьи] [Обсудить в форуме]
Перевод с английского: Виталий Готовцов
WWW: http://www.vitgot.narod.ru
Перевод с C#: Гайдар Магдануров
Масштабируемы ли вы настолько, насколько могли бы быть? Если вы помещаете в базу данных большую часть своей информации, то не рассчитывайте на это.
Секрет в том, что если вы хотите масштабируемости – примените XML, XSL и XSLT-процессоры. Что такое XSLT-процессор? Это возможность, которая делает преобразование XML и XSL пустяковой задачей. И что это значит? Платформа .NET предлагает класс, XSLTransform, который облегчает вашу жизнь. Очень мило, да? Что самое удивительное в XSL Преобразовании – это то, что вы можете подготовить весь контент (данные, ссылки, и т.д.) в XML, и затем преобразовать его во что угодно (текст, html, xml, aspx) с помощью XSL.
Что действительно заставляет XSL работать хорошо, так это то, что вы можете забыть о несовместимости браузеров и старых браузерах, которые не обладают легкостью преобразования XML. XSL Transform вместе с CSS будут так хорошо форматировать ваш веб-сайт, что даже ваша мама не сможет найти различий между преобразованной веб-страницей и той, что сделана с большим трудом на HTML. В самом деле, настоящая ценность заключена в скорости и масштабируемости вашей системы – вот почему, если вы можете сделать это, вам следует переместить весь «статичный» контент из базы данных в XML-документы. Когда я говорю «статичный», я имею в виду данные в вашей базе данных, которые не изменятся или очень не желательно, чтобы они изменялись.
Эти «статичные» данные могут быть помещены в виде XML – снижая, тем самым, расходы на дорогостоящие запросы к базе данных, которые могут быть используемы для чего-то более полезного, например динамический поиск в авторском столбце. Перемещая всю тяжесть с SQL и сетевого трафика на простой I/O, вы приобретаете себе настоящую масштабируемость.
Но, хорошо. Я поместил все свои данные в XML и теперь они выглядят, как какой-то вздор. Я не могу найти в них какого-то смысла и парни из отдела маркетинга готовы совершить кровавое убийство…. Расслабьтесь. Вот когда наступает время XSL. XSL расшифровывается как расширяемый язык таблиц стилей (eXtensible stylesheet language) – вы можете относиться к нему, как к скрипту, который преобразует XML в замечательно выглядящую страницу. XSL может взять любой XML-документ и сделать из него все, что вам угодно – другой XML-документ, текстовый файл или aspx-страницу. Суть в том, что XML – это ваш контент, XSL – ваш представительский уровень – а XSLTransform – это клей, который связывает их вместе.
Вот код, который я использовал на своем сайте tiberi.us
Public Function TransformXML(strXMLURL As String, strXSLURL As String) As String
Dim oSW As New System.IO.StringWriter()
Try
Dim oXR As New System.Xml.XmlTextReader(strXMLURL)
Dim oXSLT As New System.Xml.Xsl.XslTransform()
oXSLT.Load(strXSLURL)
Dim oXPath As New System.Xml.XPath.XPathDocument(oXR)
oXSLT.Transform(oXPath, Nothing, oSW)
Catch e As System.Exception
'Put in custom error handler here...
Dim x As String = e.ToString()
End Try
Return oSW.ToString()
End Function 'TransformXML
Достаточно одного взгляда на код, чтобы увидеть мощь XSL-процессора.
Public Function TransformXML(strXMLURL As String, strXSLURL As String) As String
' Создание IOStream
Dim oSW As New System.IO.StringWriter()
Try
Dim oXR As New System.Xml.XmlTextReader(strXMLURL)
Два параметра, которые мы передаем в этот метод - это URL XML-файла и URL XSL-файла. Так как у нас есть оба эти параметра, мы можем преобразовать оба наших файла во что-то полезное. Обратите внимание, что мы создали объект StringWriter, использовали XMLTextReader и передали ему URL нашего XML-файла.
Итак, вот сердце нашего метода…
Dim oXSLT As New System.Xml.Xsl.XslTransform()
oXSLT.Load(strXSLURL)
Объект XSLTransform, который мы продемонстрировали, выполняет здесь всю тяжелую работу. После того, как мы дали ему знать, где находится наш XSL-файл и передали его XPathDocument, мы можем выполнять преобразование.
Dim oXPath As New System.Xml.XPath.XPathDocument(oXR)
oXSLT.Transform(oXPath, Nothing, oSW)
Catch e As System.Exception
' Добавте дополнительную обработку ошибок здесь
Dim x As String = e.ToString()
End Try
Return oSW.ToString()
Обратите внимание, что метод oXSLT.Transform принимает три аргумента, «входящее», список аргументов для XSLT и «исходящее». Мы передаем XPathDocument, в качестве «входящего», NULL, в качестве аргументов, и отправляем преобразованный XML в StringWriter. Не смотря на то, что вы можете использовать перегруженный метод Transform, который непосредственно предоставляет URL XML- и XSL-файлов, я решил вести вас долгим путем выполнения Transform, чтобы вы узнали, что допускает этот объект.
Хотя мы передаем NULL в качестве XSLT-аргументов, мы получаем преимущество чего-то очень мощного – возможность обрабатывать порции нашего XML, основанные на параметрах, предлагаемых в наших XSLT аргументах. Мы можем записать наш XSL таким способом, чтобы он передавал параметры, которые мы установили, так же, как в этот раз.
' Создание XsltArgumentList.
Dim xslArg As New System.Xml.Xsl.XsltArgumentList()
Dim oTime As TimeSpan = DateTime.Now.TimeOfDay
xslArg.AddParam("cur_time", "", oTime.ToString())
И в нашей XSL таблице, мы будем ссылаться на наш параметр, который мы передали в нее, так же, как мы полагаемся на скрипт, помещенный в XSL.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="cur_time"/>
<xsl:template match="/">
Current Time: <xsl:value-of select="$cur_time"/>
</xsl:template>
</xsl:stylesheet>
Чтобы получить XsltArgumentList в следующем шаге, мы можем обработать условное выражение, основанное на параметрах, которые вы в него передали через XsltArgumentList.
Теперь, когда у нас есть знания о том, как работает XSLTransform, давайте поговорим еще немного о масштабируемости и о том, как мы можем еще добавить возможностей. Вот три стратегии, которые использует большинство, когда применяет мощь XSLTransformation.
Стратегии XML и XSLT
- Преобразование по запросу
- Фабрика преобразований
- Фабрика кэшированных преобразований
Преобразование по запросу
Во время использования стратегии Преобразования по Запросу, HTML- или ASPX-страницы создаются динамически, применяя таблицы стилей XSL к XML-документу и используя преобразование объекта для создания исходящего документа. Когда пользователь обращается с запросом к вашему веб-сайту объект XSL преобразования используется для форматирования ресурса согласно разметке XSL-документа. Вы можете пользоваться этой стратегией, если создаете XML-документ используя метод System.Data.SqlClient.WriteXML(), основанный на динамическом запросе вашего конечного пользователя, если ваши XML- или XSL-документы создаются на лету, или если вам нужно передать конечному пользователю абсолютно динамичную информацию.
Фабрика Преобразований
В Фабрике Преобразований HTML- и ASPX-страницы создаются из XML и XSLT и сохраняются, как «статичные» страницы. Используя Фабрику Преобразований, вы можете создавать сотни статичных страниц из динамичных источников и сохранять результаты создания этих страниц по запросу. Вы можете настроить Фабрику Преобразований на обработку тысяч XML-файлов, применяя XSL и сохраняя результаты в HTML, ASPX или любом другом формате по вашему желанию. Конечные пользователи будут подключаться к этим «статичным» страницам без передачи «запроса» на XSL Преобразование. Вы можете захотеть применить эту стратегию, если вы не хотите создать впечатление, что ваш веб-сайт или информация, изменяется. Нет необходимости применять XSL к XML всякий раз, когда конечный пользователь обращается с запросом к ресурсу на вашем сайте.
Кэшированные Преобразования
Кэшированное преобразование – это простое преобразование, которое происходит по установленному графику, скажем, раз в 24 часа. Результат XSL Преобразования кэшируется на день, или до тех пор, пока он нужен, и предоставляется конечному пользователю. На самых «динамичных» сайтах эта стратегия может иметь место пока вам не нужно выдать динамичную информацию, которая должна быть сиюминутной – как информация, необходимая приложению на фондовой бирже. Большинство задач нуждается в кэшировании информации один или два раза в день. Просто кэшируйте каждую страницу по истечению 24 часов после кэширования. Так же вы можете создать зависимость от любого файла (в данном случае от XML-файла), чтобы в случае изменения файла, ваш кэш обновлял информацию об обновленном файле.
В заключении, XSL-преобразование является очень искусной и нужной технологией. Этот мощный инструмент позволяет вам создать перевес входящего над исходящим – давая необходимый отдых вашему корпоративному бумажнику.