Xml bad

View a simple XML file note. HOW TO. Page address:. Your message has been sent to W3Schools. W3Schools is optimized for learning, testing, and training. Examples might be simplified to improve reading and basic understanding.

Поиск данных по Вашему запросу:

Перейти к результатам поиска >>>

ПОСМОТРИТЕ ВИДЕО ПО ТЕМЕ: Webinar: XML security – It’s just data, how bad can it be?

List of XML and HTML character entity references

Tech support scams are an industry-wide issue where scammers trick you into paying for unnecessary technical support services. You can help protect yourself from scammers by verifying that the contact is a Microsoft Agent or Microsoft Employee and that the phone number is an official Microsoft global customer service number. Did this solve your problem? Yes No. This site uses cookies for analytics, personalized content and ads.

By continuing to browse this site, you agree to this use. Learn more. My system is vista home basic. This thread is locked. You can follow the question or vote as helpful, but you cannot reply to this thread.

I have the same question Replied on September 22, Thanks for marking this as the answer. How satisfied are you with this reply? Thanks for your feedback, it helps us improve the site. How satisfied are you with this response? This site in other languages x.

How to Fix a 400 Bad Request Error

It complements HTML which is used to display the data. XML is commonly used to transmit data between different kinds of applications. We walk you through XML Parsing error codes and what they mean. We assume you have a basic web development background. If not, you may first want to take this course to get started with web development.

XML Parsing Error : How to Interpret What the Machine is Telling You

In XML, element names are defined by the developer. If these XML fragments were added together, there would be a name conflict. When a namespace is defined for an element, all child elements with the same prefix are associated with the same namespace. However, companies often use the namespace as a pointer to a web page containing namespace information. Defining a default namespace for an element saves us from using prefixes in all the child elements. It has the following syntax:. HOW TO. Page address:. Your message has been sent to W3Schools.

XML introduction

As hype passes, IT professionals seeing benefits, challenges of adopting standard. Intellor surveyed attendees at a Wilshire conference in March. The survey provided a current snapshot of where companies are with their levels of understanding, acceptance, adoption, implementation, application and selection of XML and XML-related technologies, as well as the impact XML has had or will have on their organizations. At the same time, 64 percent of respondents said that the immaturity of XML was a primary challenge in adopting the standard.

How to extract and analyze the errors from the hybrid migration report using PowerShell

Before jumping to the report analysis part, please be aware of below recommendations, as these can help you to have a clear picture of the issue and to understand better what should be done next:. When you will start a migration batch from Office EAC, if the migration fails for a particular user, you will download the migration report in TXT format, where you can see some details about the migration, some statistics and the errors encountered. Sometimes it happens that the migration errors from the TXT report to be very explicit, but in some scenarios these are very general and you are not very sure about how to proceed further. The good news is that we have at our hand the option to see more details about these failures, by analyzing the migration report from PowerShell and extracting the migration errors in a more detailed and efficient way. As an admin, you have to follow below steps to export the detailed migration report into an XML file, then you can import it at any future time, to analyze it:. I consider the method to export the migration report into an XML file being the most efficient option, because during the troubleshooting, you may want to delete the failed move and re-try it, but without saving the XML report, you will loose also the future chance to see the report for previous moves.

Validate an XML file

There is a load or parse error in the XML. In this case, a FileNotFoundException is raised. The Load method always preserves significant white space. The PreserveWhitespace property determines whether or not insignificant white space, that is white space in element content, is preserved. The default is false ; white space in element content is not preserved. If you want validation to occur, you can create a validating XmlReader instance by using the XmlReaderSettings class and the Create method. For more information, see the Remarks section of the XmlReader reference page.

Comment 2. Java Model Below is the Java model that we will use for this example. The following demo code can be used to prove that everything works.

By using our site, you acknowledge that you have read and understand our Cookie Policy , Privacy Policy , and our Terms of Service. Stack Overflow for Teams is a private, secure spot for you and your coworkers to find and share information. The characters described here are all the characters that are allowed to be inserted in an XML document. Basically, the control characters and characters out of the Unicode ranges are not allowed.

The Bad Request Error is an HTTP response status code that indicates that the server was unable to process the request sent by the client due to invalid syntax. As with the dozens of potential HTTP response codes, receiving a Bad Request Error while accessing your own application can be both frustrating and challenging to fix. Such HTTP response codes represent the complex relationship between the client, a web application, a web server, and often multiple third-party web services, so determining the cause of a particular status code can be a difficult, even within a controlled development environment. All HTTP response status codes that are in the 4xx category are considered client error responses. These types of messages contrast with errors in the 5xx category, such as the Gateway Timeout Error we looked at last week, which are considered server error responses. Many smart phone apps that have a modern looking user interface are actually powered by a normal web application behind the scenes; one that is simply hidden from the user. In these scenarios, the server is still the network object that is producing the Bad Request Error , and returning it as the HTTP response code to the client, but it could be that the client is causing the issue in some way.

Show less They are simply a way of storing data that can be easily read by other programs. Many programs use XML to store data. As such, you can open, edit, and create an XML file in any text editor.

Настольный справочник по атакам на XML-приложения

Содержание статьи

С одной стороны, тема XML injection — это жуткий баян, а с другой — она так популярна, что баги такого типа присутствовали во многих X-конкурсах последнего времени, например ZeroNights HackQuest и месяце поиска уязвимостей в Яндексе. В этой статье мы постарались собрать и систематизировать все, что известно об XML injection на данный момент.


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

Часть первая, теоретическая

Начнем издалека. Стандартом определены два уровня правильности документа XML:

  1. Правильно построенный (well-formed) документ. Такой документ соответствует общим правилам синтаксиса XML, применимым к любому XML-документу. И если, например, начальный тег не имеет соответствующего ему конечного тега, то это неправильно построенный XML.
  2. Действительный (valid) документ. Действительный документ дополнительно соответствует некоторым семантическим правилам. Это более строгая проверка корректности документа на соответствие заранее определенным, но уже внешним правилам. Эти правила описывают структуру документа: допустимые названия элементов, их последовательность, названия атрибутов, их тип и тому подобное. Обычно такие правила хранятся в отдельных файлах специального формата — схемах.

Основные форматы определения правил валидности XML-документов — это DTD (Document Type Definition) и XML Schema. Остановимся на DTD. Стандартом предусмотрено два варианта связывания документа с его схемой: либо через ссылку на схему в заголовке XML-документа (этот заголовок называется Document Type Declaration):

либо через описание схемы в документе inline (аналогия: подключение CSS через ссылку или inline):

Самое интересное в DTD — это то, что умные люди придумали так называемые сущности. Придумали, чтобы можно было подключать часто используемые фрагменты XML-документов по имени. Сущность определяется в DTD через директиву и используется в документе как &name;. А потом кто-то подумал, что глобализация должна быть глобальной, и придумал еще и внешние сущности (external entities). Например, можно определить внешнюю сущность current-date:

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

Успешное разрешение внешней сущности, указывающей на /etc/passwd

Хакер #156. Взлом XML Encryption

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

Последний элемент технологии — парсеры, которые, собственно, и разбирают XML-документы, валидируют их, разрешают внешние сущности, реализуют стандартный интерфейс к построенной объектной модели (DOM) и тому подобное. Парсеры бывают валидирующими и невалидирующими. Вот что сказано в стандарте о поведении парсера при наличии в документе ссылок на внешние сущности:

«When an XML processor recognizes a reference to a parsed entity, in order to validate the document, the processor must include its replacement text. If the entity is external, and the processor is not attempting to validate the XML document, the processor may, but need not, include the entity’s replacement text. »

Это важно! Тут говорится, что валидирующий парсер обязан включить в документ содержимое внешнего файла (логично, иначе как парсер проверит правильность структуры документа?), а невалидирующий — по желанию. Однако на практике это свойство «по желанию» выполняется практически у всех популярных парсеров.

Популярные XML-парсеры

Интерпретируемые языки (PHP, Perl, Python, Ruby и другие):

  • большинство парсеров используют библиотеки libxml2 (xmlsoft.org, последняя версия — 2.7.8) и libxslt (xmlsoft.org/XSLT/);
  • некоторые парсеры используют другие библиотеки (например, модуль expat-XML::Parser в Perl использует библиотеку Expat XML Parser) либо полностью реализуются на «родном» языке (например, парсер REXML в Ruby).


  • Apache Xerces: xerces.apache.org, последняя версия — 2.11.0;
  • (для XSLT) Apache Xalan-Java: xml.apache.org/xalan-j/, последняя версия — 2.7.1;
  • работа с XML-парсерами в Java реализуется через общий интерфейс Java API for XML Processing (JAXP. В ранних версиях Java через JAXP был доступен парсер Crimson от Sun).

Windows-платформа, .NET:

  • в большинстве Windows-приложений (написанных на Delphi, JScript, VBScript и так далее) для обработки XML используется парсер MSXML (goo.gl/hPdbg, последняя версия — 6.0 SP2);
  • в .NET-приложениях для парсинга XML используются классы из пространства имен System.XML (XmlTextReader, XslTransform и другие).

Часть вторая, переходная

Возможность подключения внешних сущностей волнует нас прежде всего в контексте анализа защищенности веб-приложений. Из всего зоопарка протоколов, основанных на XML, нас будут интересовать только популярные: SOAP и XML-RPC (краткую справку о них ты найдешь во врезках).

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

  1. В HTTP-запрос, в котором на сервер передается XML, вставляем .
  2. В теле XML-документа даем ссылку на сущность — &xxe; .
  3. В ответе получаем содержимое локального файла.

Однако в реальности, как говорится в одном анекдоте, «есть нюанс». Прежде всего попробуем рассмотреть XML-парсеры чуть более подробно. Как они обрабатывают внешние сущности по умолчанию?

Есть три класса популярных платформ: .NET, Java и интерпретируемые языки (PHP, Perl, Python, Ruby и подобные). Отметим, что все перечисленные ниже парсеры по умолчанию не производят валидацию обрабатываемого документа. В Windows и .NET используются MSXML-парсер и пакет System.xml соответственно. Только начиная с шестой версии, библиотека MSXML перестала разрешать ссылки на внешние сущности по умолчанию. В Java обычно используются пакеты Xerces и Xalan (для XSLT). И в том и в другом пакете ссылки на внешние сущности по умолчанию разрешаются. Наши же любимые интерпретируемые языки используют библиотеки libxml2 и libxslt (для XSLT), которые тоже по умолчанию разрешают ссылки на внешние сущности. Вывод: запрет на разрешение внешних сущностей в подавляющем большинстве случаев (библиотек) — ответственность программиста.


Спецификация протокола SOAP подробно регламентирует структуру SOAP-сообщения, в частности явно запрещает использование DTD:

«The XML infoset of a SOAP message MUST NOT contain a document type declaration information item».

Таким образом протокол защищен от возможности проведения XXE-атак. С другой стороны, конкретные реализации протокола часто не следуют спецификации.

Для того чтобы понять, насколько много уязвимостей XXE присутствует в реальном мире, надо разобраться с тем, где и когда в веб-приложениях используются парсеры. Мы выделяем два класса использования парсеров: на уровне платформы / стандартных библиотек и на уровне прикладного (своего) кода. Типичный пример использования парсеров на уровне платформы —поддержка протоколов XML-RPC и SOAP, на уровне прикладного кода — реализация обмена данными между приложением и пользователем: импорт, экспорт и так далее. Со вторым случаем все ясно — вряд ли найдется много программистов, которые при инициализации XML-парсеров подумают о том, чтобы запретить разрешение внешних сущностей. Поэтому большинство функций импорта данных в веб-приложение через XML являются уязвимыми к внедрению внешних сущностей (за примером далеко ходить не надо: LFI через XXE-уязвимость в phpMyAdmin — goo.gl/5RDrM).

Разберемся теперь с первым случаем — уровнем платформы. Посмотрим, что говорят спецификации протоколов XML-RPC и SOAP про внешние сущности. В спецификации SOAP нас расстраивают: «a SOAP message MUST NOT contain a document type declaration information item». Как показывает опыт, наличие правил в стеке еще не означает, что их будут выполнять на практике. Тем не менее, шансов найти уязвимость в коде платформы, реализующей SOAP, намного меньше, чем в прикладном коде. С протоколом XML-RPC ситуация значительно лучше (для нас): про запрет внешних сущностей или подключение DTD в спецификации не сказано ни слова.

В результате всего изложенного мы сможем вывести классы приложений, которые, вероятнее всего, будут уязвимы к разрешению внешних сущностей (в порядке убывания вероятности):

  1. Custom-приложения с функцией импорта данных в XML.
  2. Приложения, реализующие протокол XML-RPC.
  3. Веб-сервисы, реализующие протокол SOAP.


На примере Xerces-парсера покажем, как можно защититься от XXE. Итак, устанавливаем необходимые значения для свойств парсера:

При помощи метода setEntityResolver можно задать свой обработчик внешних сущностей (появляется возможность не просто игнорировать сущности, но и обнаруживать XXE-атаки на наше приложение!). Для других XML-парсеров можно найти аналогичные свойства.

  • Протокол XML-RPC: разработан в 1998 году (xmlrpc.scripting.com/spec.html), автор — Дэйв Уинер (Dave Winer).
  • Протокол SOAP: разработан в 1998 году, текущая версия спецификации Simple Object Access Protocol specification Version 1.2 (www.w3.org/TR/soap12-part1/).

Часть третья, практическая

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

  1. Необходимо разместить на своем веб-сервере тестовый документ extdoc.txt с каким-нибудь содержимым, например «include me please!» (на самом деле файл можно даже не размещать!).
  2. Дать ссылку на него в XML-теле HTTP-запроса.
  3. Проверить access.log нашего веб-сервера — а не обратился ли кто к нему? (Или ищем ошибку 404, если не размещали.)

Входной параметр — URL модуля, который сделает XSLT-трансформацию
по XSL-файлу

Учитывая, что в протоколах SOAP и XML структура ожидаемого на сервере документа известна, описанный процесс тестирования легко автоматизируется (скрипты и описание ты найдешь на диске):

  1. Берем список URL, реализующих XML-протоколы, и в цикле отправляем по каждому адресу XML-документ (мы его заготовили заранее) формата SOAP или XML-RPC с внешней сущностью, которая ссылается на файл с нашего сервера. При отправке записываем IP-адрес и доменное имя очередного кандидата в файл.
  2. Наш веб-сервер сконфигурирован не отдавать документ с телом XML-сущности как статический файл, а перенаправлять запросы к нему на специальный обработчик (например, php). Mod_Rewrite в помощь. Обработчик фиксирует все входящие запросы в журнал, записывая IP-адрес отправителя.
  3. Чекаем полученные списки по IP-адресам и понимаем, какие URL заходили к нам за файлом.
  4. Здесь следует учесть, что сетевой фильтр на стороне тестируемого веб-приложения может запрещать исходящие соединения в интернет, тогда наш метод «в лоб» не сработает. Внимательный читатель спросит: откуда же взять эти начальные списки URL для проверки? Конечно, у заказчика тестирования, ответим мы; после чего случайно оброним парочку намеков на паттерны гуглопоиска:

XXE в Safari позволяет вредоносной веб-странице считывать локальные файлы с машины клиента

Итак, тестируемое нами приложение разрешает внешние сущности. Что дальше?

  1. DoS — на никсах и на винде (последнее работает нестабильно).
  2. Сканируем локальную сеть — . Помни, что сообщения об ошибках и временные задержки — наше все! Кстати, про случай из жизни, связанный с этим трюком, написано в статье «Funny hacks» Владимира Воронцова в этом номере.
  3. Читаем локальные файлы. Казалось бы, все должно быть просто: вставляем и мы на коне! Но нет.

Во-первых, тебе кто-то обещал, что сущность, которую ты определил в HTTP-запросе, попадет в HTTP-ответ? Правильно, никто не обещал. Должно повезти. Стоит сказать пару слов про методику тестирования. В custom-приложениях и SOAP-сервисах формат обрабатываемого XML-документа известен (помним про WSDL). То есть нам необходимо во все теги отправляемого документа запихнуть ссылку на нашу сущность и посмотреть, вернется ли она в ответе. С XML-RPC дела обстоят хуже: в общем случае мы не знаем сигнатур методов, реализуемых приложением. Т.е. автоматизировать подстановку сущностей в параметры вызываемых RPC-методов в общем случае нам не удастся. Тут тебе в помощь может прийти спек, описывающий расширение XML-RPC, — http://xmlrpc-c.sourceforge.net/introspection.html. Используя его, ты, например, можешь получить список методов, поддерживаемых на сервере. Увы, далеко не все XML-RPC приложения реализуют интроспекцию. Во-вторых, почему после подстановки сущности итоговый XML должен остаться правильно построенным? Хорошо, что как минимум в случае с PHP по этому поводу беспокоиться не стоит, — делаем base64-обертку вокруг считываемых данных:

Далее мы должны познакомить тебя еще с одним интересным методом внедрения XML. Данный метод может привести к выполнению кода на сервере. Есть такая технология, называется XSLT (см. врезку). Обычно она используется для перевода XML-документов, обрабатываемых веб-приложением, в пригодный для отображения в браузере вид. Для трансформации нужны два XML-документа: исходный документ, который мы хотим трансформировать, например, в XHTML, и документ с описанием трансформации. В 99% случаев документ, описывающий трансформацию, лежит на сервере веб-приложения, а путь к нему прописан в каком-нибудь конфиге. В остальном проценте случаев путь к нему передается в URL (:facepalm:). Учитывая такой дизайнерский шаг, можно быть уверенным в том, что интересующий нас HTTP-параметр не подвергается никакой обработке, то есть мы сможем указать XSL-документ, лежащий на нашем сервере. А дальше, если XSLT-трансформатор был инициализирован в PHP-коде кривого веб-приложения следующим образом:

то мы сможем внутри XSL-документа использовать PHP-функции, например, вот так:

Хорошо, что подобных приложений в природе мало (google кунг-фу поможет тебе их найти) и с каждым днем становится все меньше :).


Extensible Stylesheet Language (XSL) — это группа языков, предназначенных для преобразования XML-документов или их визуального представления. Эта группа состоит из трех частей:

  • XSL Transformations (XSLT) — язык преобразований XML-документов;
  • XSL Formatting Objects (XSL-FO) — язык, специфицирующий визуальное представление XML-документа;
  • XML Path Language (XPath) — язык, предназначенный для доступа к определенным частям XML-документа (используется как в контексте XSLT, так и самостоятельно).

Специфицируется консорциумом W3C (Extensible Stylesheet Language (XSL) Version 1.1).

Часть четвертая, демонстрационная

Мы подумали: интересно, а за сколько мы сможем найти в интернете приложение, уязвимое не просто к классической XXE-атаке, а чтобы там еще и XSLT-трансформация была? Сказано — сделано.

Перво-наперво мы пошли на сервисы поиска программного кода (opensearch.krugle.org, koders.com), а также в Google (пользуясь случаем, хочу выразить глубокое сожаление по поводу так не вовремя закрытого сервиса Google Code Search). Нас интересовал заведомо уязвимый участок кода, связанный с загрузкой XML- или XSL-документа для последующей XSLT-трансформации, имя которого берется прямо из параметра GET-запроса. Таким образом мы искали строки вида «$xsldoc->load($_GET» и «$xmldoc->load($_GET». В результате нашлись проекты с уязвимым кодом, но масштаб проектов нам не понравился, и мы решили не связываться с ними. Следующей идеей был поиск веб-приложений, в которых есть модули XSLT-трансформации, принимающие в качестве аргумента имя XML-документа: inurl:”transform.php?xml=” (и потрясающее inurl:”transform.py?xml=” — от структуры URL на сайтах из выдачи слезы наворачивались на глаза). В итоге для дальнейшего анализа мы взяли одно из приложений, в URL которого было значение /path/transform.php?xml= . Нам повезло, что обо всех ошибках, возникших при трансформации, приложение радостно сообщало в HTTP-ответе. Первым делом нам интересно было узнать, что произойдет, если вместо имени локального XML-файла указать что-то удаленное: /path/transform.php?xml=http://ya.ru/. Как мы и предполагали, оно деловито полезло за XML-документом на Яндекс, но поперхнулось (см. иллюстрацию).

Дальше план был таков:

  1. Скачать на управляемый нами веб-сервер исходный XML-документ, который успешно проходит трансформацию. Документ, очевидно, был доступен как /path/ .
  2. Добавить в документ inline-DTD, в которой определить парочку сущностей — простую и внешнюю:

а в самом XML-документе сослаться на простую сущность pi (для начала).

  • Запросить трансформацию заряженного XML с нашего сервера: /path/transform.php?xml=http://youllneverguessthena.me/inc.xml и поискать в ответе число пи (почему его там могло не оказаться — читай ниже). Нам повезло — сущности, разрешаемые парсером в исходном документе, проходили трансформацию в конечный документ. Нам оставался последний шаг.
  • Модифицируем XML-документ на нашем сервере второй раз, добавляя ссылку на внешнюю сущность (&htaccess;) в тело документа, и повторяем запрос на трансформацию. Конечно, читать остальные файлы (в том числе /etc/passwd и /dev/zero) мы не стали, зато уведомили администратора сайта об уязвимости.
  • XXE в Яндексе обнаружилась при обработке SOAP (к слову о specification vs implementation)

    Теперь пару слов о том, почему нам повезло. Вообще-то XSLT-трансформатор не обязан выводить в итоговый документ сущности, разрешенные в исходном. Чтобы заставить его это сделать, в libxml2 (а следовательно, и в PHP) нужен дополнительный вызов. В итоге код, реализующий трансформацию, должен быть примерно таким (ключевая строка — substituteEntities ):

    • Спецификация XML 1.0L: goo.gl/nUKXz.
    • Список XML-протоколов от W3C: goo.gl/KzUVZ.
    • Блог Владимира Воронцова, описание XXE в Яндексе: goo.gl/9KIax.


    Вообще отношение к сущностям во время трансформации сильно зависит (внезапно!) от конкретного парсера. Так что на практике тебе придется проверять поведение в каждом конкретном случае. Сохранение сущностей после трансформации в современных XML-парсерах — отличная тема для хорошего и очень востребованного обзора. Anyone? У нас все.

    Способы обработки XML в Qt — Stream, SAX, DOM

    Многие сталкивались с XML-документами и знают что это такое, ведь стандарт рассматриваемого языка разметки опубликован в далеком 1998 году. Язык XML используется во многих областях, но чаще всего для передачи информации через Internet — не случайно стандарт разработан Консорциумом Всемирной паутины (W3C) [1].

    Очень много информации в этом мире записано и передается в формате XML, например ленты новостей RSS и Atom. В связи с этим не будут лишними навыки использования библиотек для обработки XML-файлов.

    В статье рассмотрены три варианта разбора файлов в формате XML средствами библиотеки Qt. В качестве примера используется файл, возвращаемый Центральным банком Российской Федерации на запрос курса доллара в заданный период [2].

    Для получения файла с курсом валюты на сайт Центрального банка высылается запрос. Используется QNetworkAccessManager, подробно описанный в статье «Получение данных с сайта. Шаблон Producer/Consumer» [3]. Данные, извлеченные из файла, выводятся на график средствами библиотеки Qwt [4].

    рис. 1 Снимок окна с графиком курсов валют


    Архитектура приложения, запрос курса валют

    Класс RateReceiver передает запрос курса доллара сайту Центрального банка и осуществляет обработку, приходящего в ответ XML-файла. Когда ответ от сайта будет полностью получен, объект класса QNetworkAccessManager вырабатывает сигнал finished(), связанный со слотом on_load класса RateReceiver. В слоте on_load() из входного файла выделяется информация для построения графика и передается с сигналами rate() экземпляру MainWidget. По завершению обработки файла вырабатывается сигнал loadFinished().

    Объект класса MainWidget накапливает данные о курсах валют в векторе, а затем, по приходу сигнала loadFinished(), выводит точки на график.

    рис. 2 UML диаграмма классов

    На диаграмме классов показано, что RateReceiver сам справляется с обработкой входного файла в слоте on_load и, лишь при использовании SAX-интерфейса (см. ниже), работа с файлом делегируется отдельному объекту (XmlSaxHandler).

    Код приведен схематично, внимание можно обратить на слот rateRequest, производящий запрос к сайту Центрального банка. В запросе передаются параметры — начало и конец временного интервала, код валюты. Для передачи параметров запроса в библиотеке Qt используется класс QUrlQuery.

    Средства обработки XML в библиотеке Qt

    В библиотеку Qt включены три класса, реализующих различные подходы к обработке XML-документов:

    • QXmlStreamReader [5], воспринимает документ в виде потока тегов. Интерфейс класса позволяет перемещаться по этому набору. Класс предоставляет самый быстрый обработки XML-документов, однако об иерархической структуре документа класс ничего не знает и не подходит для добавления информации в документ;
    • QXmlSimpleReader [6], реализует SAX-интерфейс (Java API) для работы с XML. Фактически, является тем же QXmlStreamReader, но в другой обертке — при считывании тега в объекте-обработчике вызывается виртуальная функция, соответствующая типу тега. Функция-обработчик ничего не знает о предыдущих вызовах и обрабатывает только текущий тег, поэтому требует также мало памяти, как QXmlStreamReader и не подходит для изменения документа;
    • QDomDocument [7], реализует DOM-интерфейс (W3C API) обработки XML. Считывает весь документ в память в виде дерева, поэтому не рекомендуется для обработки больших документов. Позволяет изменять дерево и, соответственно, документ.

    Пример использования QXmlStreamReader

    Объект класса QXmlStreamReader может быть инициирован открытым файлом или массивом байт, содержащим XML-документ. Вызов метода readNext() приводит к считыванию следующего токена и возвращает его тип (TokenType). Из множества типов токенов нас будут интересовать StartElement и EndElement, отвечающие за открывающий и закрывающий тэги соответственно. Тэг имеет имя, которое возвращает метод name(), и набор атрибутов. Набор атрибутов (QXmlStreamAttributes) можно получить методом attributes(), он представляет собой вектор именованных атрибутов. Для обращения к атрибуту по имени используется метод value().

    Во время работы приведенного листинга в памяти одновременно будет находиться информация, связанная лишь с одним тегом. Для файлов сложной структуры код может быть очень запутанным — в этих случаях предпочтительно использовать SAX.

    Пример использования QXmlSimpleReader

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

    Теперь класс RateReceiver является лишь посредником в передаче сигнала. При получении файла с сервера RateReceiver вызывает метод setData, чем инициирует обработку файла и выдачу сигналов.

    Класс XmlSaxHandler наследует виртуальные методы, которые вызываются при считывании парсером лексемы определенного типа — startElement(), endElement(), characters(), а также метод fatalError(), срабатывающий при возникновении ошибки. Все перечисленные методы возвращают true если обработка прошла успешно, иначе — false.

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

    Пример использования QDomDocument

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

    Для получения корня дерева используется метод documentElement(). Все остальные узлы (QDomNode) дерева являются дочерними для других узлов, получить первый дочерний узел можно методом firstChild(), перейти к следующему узлу — методом nextSibling(). У узла есть имя, возвращаемое методом nodeName() и набор именованных атрибутов (QDomNamedNodeMap). Получить набор, ассоциированных атрибутов можно методом attributes(), получить узел атрибута по имени — методом namedItem(). Атрибут является обычным узлом дерева (QDomNode), поэтому его значение возвращает метод nodeValue().

    Последний пример учитывает то, что тег Value должен встречаться лишь внутри тега Record, а тег Record является дочерним для ValCurs. При использовании QXmlStreamReader и QXmlSimpleReader мы не обращали на это внимание. Если требуется учитывать иерархическую вложенность тегов, то удобнее использовать либо модель DOM, либо вводить состояния в модели SAX.

    Если необходимо часто изменять документ, то альтернативы DOM нет, т.к. SAX и Stream рассматривают документ как обычный текстовый файл, добавить данные в середину которого невозможно. Если же изменения вносятся достаточно редко, то возможно создавать новый документ на основе старого, используя обычный файловый поток (QTextStream), при этом во время записи требуется экранировать служебные символы методом Qt::escape().

    Ось времени Qwt

    На рисунке 1 можно заметить необычную горизонтальную ось на графике. Установка осей в Qwt выполняется методом setAxisScaleDraw(), аргументом которого должен являться объект, которому будет делегироваться обязанность отрисовки значений на оси. Чтобы создать свою собственную ось, достаточно породить наследника класса QwtScaleDraw и реализовать в нем виртуальный метод label(double v).

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

    Восстановление хранилища компонентов

    В процессе работы разнообразных диагностических и сервисных утилит (модули, входящие в состав Центра обновления Windows), может быть выявлено повреждение хранилища компонентов WinSxS , о чем в лог-файлах нам красноречиво сигнализирует статус ERROR_SXS_COMPONENT_STORE_CORRUPT . Основные причины повреждения хранилища компонентов заключаются в том, что:

    • в процессе обновления операционной системы могут повреждаться/удаляться файлы компонентов в местоположениях с корнем в: %SYSTEMROOT%ServicingPackages и %SYSTEMROOT%WinSxS ;
    • в процессе обновления операционной системы могут повреждаться/удаляться ветви/ключи реестра в местоположениях: HKLMComponents , HKLMSchema и HKLMSoftwareMicrosoftWindowsCurrentVersionComponent Based Servicing ;

    Описанные проблемы впоследствии становятся причиной возникновения различного рода отказов установки обновлений. Повреждение/удаление файлов происходит по совершенно разнообразным причинам: сбои в сетевых модулях, дисковой подсистеме, ошибки чтения/записи оперативной памяти, аппаратные сбои любых компонентов станции, или же по причине ошибок в коде компонентов Центра обновления Windows. Чаще всего повреждаются *.cat , *.mum , *.manifest и *.dll -файлы. Все найденные методы восстановления хранилища компонентов я решил выделить в отдельную статью. И так, для восстановления хранилища компонентов у нас в распоряжении несколько разнообразных методик.

    Разновидности повреждений

    Причина 1: отсутствующий файл

    в лог-файле %WinDir%LogsCBSCBS.log можно встретить сообщения о битых файлах такого вот рода:

    Очевидно, что строки, содержащие ключевые слова Cannot repair member file.. указывают на то, что:

    • содержимое файла не соответствует содержимому хранилища для файла и WRP пытается его восстановить, тем не менее..
    • ..WRP не может восстановить файл описанного в строке компонента, потому что записи в реестре о нем присутствуют, а вот сам файл отсутствует в хранилище, о чем недвусмысленно намекает фрагмент строки ..file is missing .

    Ниже по тексту можно найти ошибку STATUS_OBJECT_NAME_NOT_FOUND , указывающую на отсутствие подкаталога. В нашем случае, как видно из отчета, повреждению подверглась целая иерархия компонента, состоящая из подкаталогов и файлов, размещавшаяся в каталоге C:WindowsWinSxSamd64_prnbr002.inf_31bf3856ad364e35_6.1.7600.16385_none_49c93aa2c4304e9e . Заглянув в целевой каталог, я убедился, что он действительно пуст, а вот что за событие/действие удалило его содержимое, остается только гадать, хотя подобные инциденты в Windows-системах сплошь и рядом.

    Причина 2: Расхождение контрольной суммы

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

    В этом случае стек обслуживания компонентов (CSI) сообщает нам, что он не может перепроецировать системный файл C:WINDOWSProvisioningMicrosoft-Desktop-Provisioning-Sequence.dat , потому как информация в хранилище так же повреждена.

    Причина 3: поврежденный или нулевой файл

    При попытке установки обновления безопасности (в данном случае KB4499164 ), процесс завершился не совсем удачно:

    В процессе изучения инцидента, в лог-файле %WinDir%LogsCBSCBS.log были обнаружены следующие ошибки:

    7601.24443.1.8 , status : 0x80073712 , failure source : Resolve , start state : Absent , target state : Installed , client id : WindowsUpdateAgent

    Ключевые слова, на которые в данном случае стоит обращать внимание, это:

    • Manifest hash for component .. does not match expected value .
    • Unable to load manifest for component ..

    Из чего следует, что в данном случае возникла проблема с файлом wow64_microsoft-windows-directshow-core_31bf3856ad364e35_6.1.7601.24382_none_0f268a5b523efde9.manifest , который является манифестом и располагается в поддиректории %SystemRoot%WinSxSManifests . При более близком изучении было выяснено, что указанный файл почему-то нулевой.

    Причина 4: попытка удаления отсутствующего компонента

    При попытках установки того же обновления безопасности KB4499164 на другой рабочей станции, мы сталкиваемся с очередной разновидностью проблемы: , Update : 4019265 – 2871_neutral_LDR , UninstallDeployment : amd 64 _ 006 f 1 bee 347 aa 0 a 86984388 c 82 ccb 379 _ 31 bf 3856 ad 364 e 35 _ 6 . 1.7601.23529_none_4683d079b6ce11b3 , Update : 4019265 – 2966_neutral_LDR , Update : 4019265 – 2966_neutral_LDR , UninstallDeployment : amd 64 _ 0 f 4370 f 0564 ad 69 cbf 1 c 9624 ac 455552 _ 31 bf 3856 ad 364 e 35 _ 7 . 6.7601.23775_none_3e0e14d4d5b6573f – 2966_neutral_LDR [ HRESULT = 0x80004005 – E _ FAIL ] , Update : 4019265 – 2966_neutral_LDR [ HRESULT = 0x80004005 – E _ FAIL ] [ HRESULT = 0x80004005 – E _ FAIL ]

    7601.24443.1.8 , status : 0x80004005 , failure source : Execute , start state : Staged , target state : Installed , client id : WindowsUpdateAgent

    Судя по всему установщик ругается на попытку удаления отсутствующего компонента amd64_microsoft-windows-w..lient-aux.resources_31bf3856ad364e35_7.6.7601.23775_ru-ru_306f57c17eac5f89 из пакета Package_846_for_KB4019265 . Сам компонент оказался на месте вместе со собственным манифестом, поэтому не понятно что же не нравится стеку обслуживания. Тем не менее что-то с этим пакетом явно не так.

    Автоматическое восстановление хранилища

    Windows 7:

    В версии операционной системы Windows 7, до определенного момента, для решения проблемы восстановления хранилища компонентов разработчиками рекомендовалось специализированное Средство проверки готовности системы к обновлению (System Update Readiness Tool). Оно было призвано помочь в устранении проблем, препятствующих установке обновлений и сервисных пакетов обновлений, иными словами выполняло проверку файлов/ключей хранилища компонентов на всевозможные повреждения. Однако с выпуском обновления KB2966583 появилась возможность использовать утилиту обслуживания компонентов и пакетов DISM, которая была доступна пользователю лишь в версиях Windows 8 и более поздних. Для выполнения процедуры автоматического восстановления хранилища компонентов в Windows 7 и более поздних ОС запустите следующую команду из командной строки (и дождитесь завершения её работы):

    dism /Online /Cleanup-Image /ScanHealth

    *в Windows 7 отсутствуют привычные нам по новым версиям ключи /RestoreHealth и /CheckHealth .

    Windows 10:

    В операционной системе Windows 10 синтаксис командной строки утилиты претерпел некоторые изменения. Для восстановления хранилиша компонентов выполняем команду:

    dism /Online /Cleanup-Image /RestoreHealth

    В современных ОС при запуске описанной выше команды, DISM уже использует возможности Центра обновления Windows для получения (подкачки) файлов, требуемых программе обслуживания образов для восстановления. Но иногда случается так, что клиент Центра обновления Windows уже поврежден, тогда у нас остается возможность использовать любой аналогичный работоспособный экземпляр Windows в качестве источника файлов для восстановления. Для этого можно скачать папку Windows рабочей копии операционной системы на съемный носитель (USB/DVD), либо подключить её по сети (в качестве сетевой папки). После всех проведенных манипуляций выполните в командной строке следующую команду:

    dism /Online /Cleanup-Image /RestoreHealth /Source:C:RepairSourceWindows /LimitAccess

    *где параметр /Source указывает местоположение рабочей копии.

    Результаты работы

    Операция по восстановлению выполняется довольно продолжительное время, а результатом будет сообщение вида: “Выполнение операции scanhealth завершено, см. журнал по адресу %windir%logsCBSChecksur.log. Операция успешно завершена.”

    Как можно увидеть из снимка экрана, вся информация о результатах восстановления содержится в файле %WinDir%LogsCBSCheckSUR.log :

    Обязательно проанализируйте данный отчет, поскольку в нем всегда отображаются детали всех ошибок, возникающих в процессе восстановления хранилища компонентов. В случае отсутствия файлов, подлежащих восстановлению, наименования их обязательно будут перечислены в данном лог-файле, тут уже рекомендуется переписать их копии с рабочей системы. Встречаются ситуации, когда после вроде де бы успешного восстановления хранилища компонентов вышеописанным методом, проблемы с обновлениями/восстановлением системных файлов все еще сохраняются (не ставятся обновления). В этом случае можно попытаться восстановить хранилище другими методами, описанными далее.

    Ручное восстановление хранилища

    При всех стараниях разработчиков из Microsoft предоставить возможность конечному пользователю системы устранять возникающие проблемы в автоматическом режиме (при помощи специальных утилит), никогда полностью не будут исключены ситуации, в которых эти самые автоматизированные средства будут давать сбои. Причина тут кроется в симбиозе старых механизмов операционной системы и необходимостью постоянного внедрения новых (сырых) технологий, должным образом не заботясь о приведении в надлежащее состояние всех связанных (участвующих) компонентов, что, в свою очередь, порождает огромное количество проблем. Поэтому, всегда надо иметь средство на крайний случай, то есть уметь восстановить работоспособность вручную. В любом случае, ручное восстановление хранилища компонентов всегда начинается с анализа лог-файла компонентной модели: %WinDir%LogsCBSCBS.log .

    Поиск рабочих экземпляров файлов

    Методика восстановления хранилища компонентов сводится к поиску рабочих копий поврежденных или отсутствующих файлов на аналогичной, максимально приближенной по версиям, полностью рабочей системе. Для этого, после исследования файла %WinDir%LogsCBSCBS.log и составления списка проблемных файлов, выполняем поиск аналогичных файлов (по строго аналогичным путям) на нормально-функционирующей системе (желательно той же версии обновлений).
    Расширения, имена файлов компонента и соответствующие им пути, которые (обычно) подлежат замене:

    • .cat и .mum – файлы компонента — каталог %WinDir%servicingPackages ;
    • .manifest -файлы компонента — каталог %WinDir%WinSxSManifests ;
    • Остальные файлы компонента ( .exe , .dll и другие) — каталог %WinDir%WinSxSимя_компонента;

    Сброс безопасности

    Поскольку объекты в иерархии директорий %WinDir%LogsCBSCBS.log защищены, непосредственно перед копированием, необходимо выполнить подготовительные действия по смене владельца необходимых каталогов и поврежденных целевых системных файлов.
    Для этого выполним следующую команду:

    takeown /f полный_путь_к файлуимя_файла

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

    icacls полный_путь_к файлуимя_файла /GRANT АДМИНИСТРАТОРЫ:F

    Копирование в целевую систему

    И уже в финальной части, можно наконец-то скопировать работоспособные копии восстанавливаемых файлов компонента/пакета на место поврежденного:

    1. Если повреждены/отсутствуют .cat или .mum файлы компонета, то скопировать их в каталог %WinDir%servicingPackages ;
    2. Если поврежден/отсутствует .manifest -файл (манифест) компонента, то скопировать его в каталог %WinDir%WinSxSManifests ;
    3. Если повреждены/отсутствуют остальные файлы компонента, то скопировать их в каталог %WinDir%WinSxSимя_компонента ;

    сделать это можно как при помощи командной строки, так и выполнить перемещение с помощью проводника Windows.

    XML формат

    1. Что такое XML формат

    Применяется формат XML сразу в нескольких направлениях:

    • верстка сайтов
    • систематизированное оформление таблиц
    • базы данных
    • настройки запуска приложений

    Читаемость – главная идея XML-документа. Даже без дополнительных инструментов можно открыть файл и, бегло пробежавшись глазами по описанным символам, легко разобраться, какие инструкции заложены внутри, и какие события запустятся при непосредственном использовании по прямому назначению.

    Базируется язык разметки на кодировке Юникод (UTF-8 и UTF-16) и легко подстраивается под любые конкретные нужды (главное соблюдать некоторые обязательные правила – к примеру, размещать в первой строчке документа обязательную конструкцию, определяющую версию XML, кодировке и подключаемых библиотеках). Но то лишь нюансы – куда важнее разобраться, как можно открыть документ XML и получить информативный текст, а не набор неразборчивых символов.

    Итак, рассмотрим популярные способы для открытия XML файл.

    2. Открыть XML через блокнот

    Операционная система Windows в предустановленном состоянии сразу же способна взаимодействовать с файлами практически любых текстовых форматов. Да, не вся информация выглядит в первозданном виде (некоторые символы из-за нечитаемой кодировки отображаются некорректно) и все же уловить основную суть не проблема! Главное – вооружиться терпением и перепробовать все возможные настройки. Какие? Инструкция ниже:

    1. Первая задача – загрузить нужный файл на компьютер в любую папку. Дальше остается или заглянуть в пуск, набрав в поиске «Блокнот», а там уж открыть документ.

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

    Если же в вызываемом списке не появился «Блокнот», то придется нажать на пункт «Выбрать другое приложение». И уже оттуда нажать на необходимую кнопку.

    2. Как результат – документ открыт в первозданном виде. Теги, атрибуты, описание действий. Да, не слишком информативно (в сути разберутся лишь программисты и верстальщики), а потому – стоит искать альтернативные источники вдохновения.

    3. Открыть XML через браузеры

    Раз уж формат XML появился для экспериментального «строительства» сайтов (на данный момент нишу верстки занимает HTML и таблица стилей CSS), то и Google Chrome и Mozilla Firefox с легкостью воспринимают всю спрятанную в документах информацию. Да еще и выводят все теги и атрибуты не только в виде текста, но и в соответствии с определенным оформлением (если внутри описана таблица, то на выходе появится информация, уложенная по полочкам строчек и столбцов).

    Как загрузить XML в браузер? Элементарно! Можно спокойненько перетащить требуемый документ в любое открытое окно, а дальше останется лишь наблюдать за результатом.

    И вот весь текст на экране, в строке поиска – каталог размещения открывшегося файла, а по центру экрана – несколько рекомендаций непосредственно от браузера. К примеру, Google Chrome может предупредить, нарушен ли где-то синтаксис, нужны ли дополнительные правки и почему, собственно, возникают проблемы.

    В Firefox ситуация та же, правда, ошибки и предупреждения выводятся на русском языке!

    Стоит ли всегда открывать XML через браузер? Однозначно ответить на вопрос невозможно. С одной стороны – можно сразу же посмотреть, как выглядит формат не «на бумаге», а в действии. Кроме того, кодировку не нужно выбирать (определяется автоматически), да и устанавливать дополнительные программы не нужно. Но то лишь со стороны непосредственного использования. Если же нужны правки, изменения или хоть какое-то взаимодействие с документов, то без дополнительных приложений точно не обойтись.

    4. XML файлы через продукты Microsoft Office

    Пакет программ от Microsoft с файлами XML взаимодействовать умеет, но лишь по части отображения конечной информации (после выполнения всех процессоров, заложенных в документе), а не для непосредственного взаимодействия и редактирования. И Word, и Excel сработают, как калькуляторы, в которые занесли целый пример, и нажали кнопку «Посчитать». В итоге, на экране и появится результат, без какой-либо дополнительной информации.

    4.1. Открыть XML в Microsoft Word:

    1. Тут два пути, как и с блокнотом. Можно или сразу открыть приложение и в выпадающем меню выбрать «Открыть».

    Или же перейти в необходимый каталог и уже оттуда, нажав правой кнопкой, вызвать список действий.

    2. Вне зависимости от выбранного маршрута, результат одинаковый. На экране появится какая-то определенная информация без тегов и атрибутов, лишь голый текст.

    Как отмечает Word, офисного набора для отображения XML в другом виде недостаточно, нужны дополнительные плагины и инструкции, устанавливаемые «сверху». В ином случае, можно и не рассчитывать на полноценное взаимодействие.

    4.2. Открыть XML в Microsoft Excel:

    1. Первоначальные действия все те же.

    2. Из реальных отличий – необходимость выбрать сценарий при взаимодействии с XML. Стоит ли Excel открывать все данные, как таблицу или же в виде книги с определенными задачами.

    3. Перепробовать можно разные варианты, однако результат такой же, как и в Word – текст, появившийся после обработки всех тегов, атрибутов и процессов, но разбитый на ячейки.

    Словом, пакет офисных программ от Microsoft не выполняет и половины требуемых задач – не позволяет редактировать текст, не отображает системные данные, да еще и с трудом обрабатывает некоторую информацию и частенько выдает ошибки. Кроме того, в последних версиях Word и Excel за 2016 год, разработчики практически отказались от возможности взаимодействия с XML, а потому и рассчитывать на подобного со скрипом работающего помощника точно не стоит.

    5. Официальные редакторы для открытия XML

    Список программ, специализирующихся на взаимодействии с XML огромен, из-за чего невозможно перечислить и половины вариантов. А потому – инструкция по использованию на примере XML Marker, бесплатно распространяемом инструменте, воспринимаемом разную кодировку, подсвечивающем синтаксис, отображающем одновременно и древо документа, и всю текстовую информацию. Кроме того, разработчики обещают автоматические обновления, исправляющие некоторые ошибки и недоработки, целую коллекцию дополнительных советов и рекомендаций, позволяющих, к примеру, избавиться от каких-нибудь ошибок при вводе (даже некоторые неправильно заданные теги в конце информационного кода могут привести к проблемам при воспроизведении).

    Из дополнительных плюсов – поддержка разных языков, возможность менять формат, а еще – невероятная скорость обработки данных (даже состоящие из тысячи ячеек таблицы открываются за считанные секунды). И, раз уж подобный редактор настолько всесилен, почему бы не приступить к установке?

    1. Прежде всего, придется заглянуть на официальный сайт. И в меню слева найти кнопку Download.

    На открывшейся странице остается лишь выбрать необходимую для загрузки версию. Доступно несколько вариантов – и совсем «древние» и «тестируемые», и последние со всеми необходимыми обновлениями. Вариантов, с какого сервера все сохранять, тоже несколько – тут уж дело вкуса (в любом случае, дистрибутив весит всего несколько десятков мегабайт).

    2. Дальше – запустить дистрибутив, прочитать строки приветствия, нажать Next.

    Принять все лицензии и пользовательское соглашение.

    Выбрать папку для установки (какой-то гигантской разницы нет).

    Последний этап – выбрать, нужны ли ярлыки на рабочем столе и в меню «Пуск», и стоит ли ассоциировать формат «XML» с программой. Если подобной необходимости нет, то все галочки можно спокойно поснимать.

    После завершения установки останется лишь запустить инструмент и приступить к непосредственному использованию.

    3. Итак, для запуска нужного файла нужно нажать на пункт «File» и вызвать выпадающее меню, затем – кликнуть на «Open» для непосредственного перехода к поиску.

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

    Ну, и коротко о ключевых возможностей. Слева – иерархия всех данных (какие теги складываются, какая информация важнее и все остальное), справа – выделенный код, снизу – отображение. Если появятся какие-то ошибки, то система сразу же обо всем предупредит, да еще и выделит место, где нужны срочные изменения.

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

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

    6. Редактирование XML-файлов онлайн

    Если необходимость платить реальные деньги за виртуальный продукт не по нраву, то остается последний вариант – воспользоваться редактором, который читает формат XML онлайн. Ресурсов с подобным функционалом много, но главный помощник расположен по адресу – xmlgrid.net

    Из ключевых возможностей – запуск нужного файла через вкладку непосредственного «Открытия». Еще можно вставлять ссылку на документ и применять теги и атрибуты вручную и с нуля. Кроме воспроизведения, можно посмотреть демонстрацию о языке XML, где разработчики постарались объяснить способы применения различных возможностей и варианты использования разметки.

    Про cellpadding=”0″ cellspacing=”0″ width=”100%”>

    14 июня 2011

    Рассказать о неймспейсах в XSLT.


    Корневым элементом XSL-шаблона является , и во многих случаях он выглядит так:

    Атрибут version является обязательным, равно как и объявление XSL-неймспейса (иначе было бы неясно, где в шаблоне сам XSL-код). А вот зачем нам нужна запись , не очень понятно.

    Для начала уясним, что вообще делают эти конструкции, начинающиеся с в начале XSL-шаблона нужна для того, чтобы сообщить XSL-процессору (трансформатору), что все элементы, не имеющие префикса, относятся к этому неймспейсу XHTML-документов. А что это дает? Самое смешное, что ничего особенного.

    Все, что произойдет, — это копирование указанного неймспейса в выходной HTML. То есть такой XSL-шаблон:

    Это, конечно, круто, и этого даже требует XHTML-спецификация, но в жизни от этого ни холодно ни жарко. Другое замеченное изменение в поведении трансформатора: если выставлен , то при отсутствии неймспейса по умолчанию выходят незакрытые теги (
    ). Но при теги начинают закрываться. Однако если кто-то думает, что сайт с валидным HTML работает лучше, чем с невалидным, то ему самое время встать и выйти. Меня это сильно раздражает, ведь сайты делаются для людей, а не для валидатора.

    Итак, берусь утверждать, что при выводе HTML ощутимой пользы от этого нет. А есть ли вред? Оказывается, небольшой есть — от неаккуратного использования.

    Трансформаторы обязаны копировать .

    Разберемся на примере. Представим, что у нас есть два XSL-шаблона, причем один импортирует другой.

    Импортируемый шаблон import.xsl:

    Результатом выполнения главного шаблона будет:

    Почему посреди нашего HTML вылезли эти , да еще три раза?

    Сначала главный шаблон выводит элементы , и . В главном шаблоне нет объявления неймспейса по умолчанию (он null), поэтому никаких , который находится в другом файле import.xsl. И вот у негó уже есть объявление неймспейса по умолчанию, которое действует на все элементы, выводимые в коде этого файла import.xsl. Поэтому при выводе абзацев

    нам и сообщается, что у них неймспейс http://www.w3.org/1999/xhtml, иначе они примут неймспейс своего родителя , который равен null. Это произошло с каждым абзацем, так как они вышли братьями.

    Рассмотрим обратную ситуацию, когда в главном шаблоне есть , а в импортируемом — нет. Тогда на выходе мы получим другой сюрприз:

    Элемент и все его потомки законно получают XHTML-неймспейс. Но у абзацев-то он null (ибо в их файле import.xsl у каждого абзаца, которая как раз и означает, что неймспейс этого элемента null.

    Вывод: надо или во всех XSL-файлах объявлять неймспейс по умолчанию, или во всех не объявлять. Лично я везде не объявляю — меньше суеты в коде.

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

    Ссылка на основную публикацию