Распознать XML-узел Нотация в собственном тексте

Учебные задачи

ЧтениеXML получает небольшой встроенный XML. Конкретное значение сравнивается с настоящим ТипУзла текущего читателя; внешние XML-файлы не открываются.

Где и как запускать

Серверная процедура своей учебной обработки. Код без директив вставьте в тело процедуры.

Подготовка

  1. Создайте серверную команду собственной учебной обработки. Основной блок вставьте в тело серверной процедуры; не переносите его в веб-клиент.

  2. XML задан в самом примере. DTD содержит только собственные объявления: идентификаторы urn:learn не являются адресами загрузки, внешние файлы и схемы не открываются.

  3. Параметры явно не игнорируют декларацию XML, DTD, комментарии, инструкции и пробелы. Проверка внешней схемы не выполняется.

XML = "<!DOCTYPE catalog [<!ENTITY book ""Книга""><!NOTATION png SYSTEM ""urn:learn:png""><!ENTITY picture SYSTEM ""urn:learn:picture"" NDATA png>]><catalog>&book;</catalog>";
Параметры = Новый ПараметрыЧтенияXML("1.0", "", ПробельныеСимволыXML.ПоУмолчанию, ТипПроверкиXML.НетПроверки, Ложь, Ложь, Ложь, Ложь, Ложь, Ложь);
Чтение = Новый ЧтениеXML;
Найдено = 0;
Попытка
    Чтение.УстановитьСтроку(XML, Параметры);
    Пока Чтение.Прочитать() Цикл
        Если Чтение.ТипУзла = ТипУзлаXML.ОпределениеТипаДокумента Тогда
            ЕстьОбъявление = Чтение.ПервоеОбъявление();
            Пока ЕстьОбъявление Цикл
                Если Чтение.ТипУзла = ТипУзлаXML.Нотация Тогда
                    Найдено = Найдено + 1;
                    Сообщить(Чтение.Имя + ": " + Чтение.СистемныйИдентификатор);
                КонецЕсли;
                ЕстьОбъявление = Чтение.СледующееОбъявление();
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    Чтение.Закрыть();
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Сообщить("Найдено узлов: " + Строка(Найдено));

Разбор по шагам

  1. Сначала создаётся читатель и устанавливается собственная строка XML.

  2. Прочитать перемещает его к очередному настоящему узлу; условие сравнивает ТипУзла с ТипУзлаXML.Нотация.

  3. Для Сущность и Нотация отдельно обходятся объявления внутреннего DTD через ПервоеОбъявление и СледующееОбъявление; обычный обход содержимого не подменяется обходом объявлений.

Как проверить результат

  1. Вывод показывает имена / значения подходящих узлов и их количество; для Ничего — состояние до чтения и после окончания.

  2. Для Сущность и Нотация показаны собственные объявления book / picture или png. Строки urn:learn остаются идентификаторами, сетевое соединение не создаётся.

Ожидаемый результат

Значение применено к реально созданному объекту, исключению, читателю или документу в указанном контексте.

На что обратить внимание

  1. Перечисление — набор значений, не строковых названий. Не заключайте используемую константу в кавычки.

  2. HTML показывает код. Выполнение производится только вручную в указанном учебном контексте 1С.

  3. СсылкаНаСущность и КонецСущности — пример синтаксиса распознавания редких событий читателя. Не обещается, что конкретный читатель вернёт их при разборе данного текста: он может разыменовать сущность без таких узлов; тогда счётчик 0 — честный результат.

  4. Не используйте этот пример для недоверенного XML с внешними сущностями. Учебный текст встроен и не содержит внешнего DTD или ссылки, которую нужно загрузить.

  5. Атрибуты читаются отдельным ПрочитатьАтрибут; этот блок не утверждает, что обычный Прочитать выдаёт каждый атрибут как отдельный узел.

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.