Имя: Пароль:
1C
 
Как прочитать комментарий в заголовке XML из DOMДокумента?
0 Crush
 
08.10.14
15:26
Файл начинается со строк:
<?xml version="1.0" encoding="windows-1251"?><!--бла бла бла-->

Строки эти добавляются так: дом.ДобавитьДочерний(дом.СоздатьКомментарий("бла бла бла"));

Читаю так:     дом = ПостроительДОМ.Прочитать(ЧтениеХМЛ);

Вот как мне получить строчку = "бла бла бла"?
1 Asmody
 
08.10.14
15:36
Перебрать дочерние узлы, найти где ТипУзла = ТипУзлаDOM.Комментарий, у него посмотреть свойство ЗначениеУзла
2 DrZombi
 
гуру
08.10.14
15:39
(0) А отладчик уже забанили?
3 Crush
 
08.10.14
15:43
(1) Спасибо конечно, но не то.
В Дочерних узлах только один узел с типом Элемент, он же ЭлеемнтДокумента.
4 Banned
 
08.10.14
15:44
Открыть как текст
5 Asmody
 
08.10.14
15:50
(3) А у этого элемента тоже есть дочерние элементы. Оно же дерево.
6 Crush
 
08.10.14
15:56
(5) :) и памятник
Мне то нужен комментарий, который находится перед главной веткой этого дерева.
<?xml version="1.0" encoding="windows-1251"?>
<!--бла бла бла-->
<ГлавнаяВетка>
  <!--Этот коммент мне не нужен! Нужен тот что выше-->
  <СледующаяВетка/>
</ГлавнаяВетка>

Попробую через ЧтениеУзловDOM. Ни разу еще пользовался, вдруг взлетит.
7 Crush
 
08.10.14
16:18
ПерейтиКСодержимому() игнорирует комментарии
из СП:Примечание:
Будут пропущены следующие типы узлов: ОбъявлениеXML, ИнструкцияОбработки, ОпределениеТипаДокумента, Комментарий.

Метод Прочитать() позиционируется на начале элемента. Походу тоже игнорирует комментарии.

Как еще можно, не прибегая к (4)?
8 Krolik Bezobraznik
 
08.10.14
16:45
Я делаю так

    мДОМ = новый ПостроительDOM;
    мДокументДОМ = мДОМ.Прочитать(ФайлОбмена);
    мРазыменовательПИ=мДокументДОМ.СоздатьРазыменовательПИ(мДокументДОМ);
    мЗапрос="./*";
    мХПуть=мДокументДОМ.СоздатьВыражениеXPath(мЗапрос,мРазыменовательПИ);
    мРезультат=мХПуть.Вычислить(мДокументДОМ);
    мРодитель=мРезультат.ПолучитьСледующий();
    пока мРодитель<>неопределено цикл
        ШапкаДокумента.Вставить(мРодитель.ИмяУзла, мРодитель.ТекстовоеСодержимое);
           мРодитель=мРезультат.ПолучитьСледующий();
    конеццикла;

В переменной мЗапрос записывай полный путь до узла, который ты хочешь загрузить.
9 Asmody
 
08.10.14
16:56
(8) Интересно, какой будет путь до комментария, который до главного узла?
10 Krolik Bezobraznik
 
08.10.14
17:00
(9) Да я как то пропустил суть, что надо комментарий получить =)
11 DS
 
08.10.14
17:21
Хотелось бы узнать, как удалось записать комментарий XML тем способом, что указан в (0).
12 Crush
 
13.10.14
15:00
(11)         
дом            = Новый ДокументDOM();
дом.ДобавитьДочерний(дом.СоздатьКомментарий("бла бла бла"));
ХМЛ=Новый ЗаписьXML;
ХМЛ.ОткрытьФайл(ИмяФайлаВыгрузки);
ЗаписьДОМ=Новый ЗаписьDOM;
ЗаписьДОМ.Записать(дом,ХМЛ);
ХМЛ.Закрыть();
13 DS
 
13.10.14
15:26
(12) Ну, это случайно удалось так сделать. Так сказать недокументированная возможность. По сути этот коментарий должен был вложиться в документ. Но т. к. в конструкторе не был указан обязательный реквизит - имя документа (главного узла), то этот узел и не был создан.
Надо написать 1с по поводу такого поведения конструктора ДокументDOM.
14 Crush
 
13.10.14
15:33
(13) Нормально отрабатывает. Вложенные узлы так же добавляю.
Кстати тема решена. Следующим постом - решение;)
15 Crush
 
13.10.14
15:35
Нужно было при чтении указать параметры (ПараметрыЧтенияXML(,,,,,,,Ложь)), тогда в дочерних узлах будут коменты.

    ЧтениеХМЛ    = Новый ЧтениеXML;
    ЧтениеХМЛ.ОткрытьФайл(ИмяФайла,Новый ПараметрыЧтенияXML(,,,,,,,Ложь));
    ПостроительДОМ    = Новый ПостроительDOM;
    ДокументДОМ    = ПостроительДОМ.Прочитать(ЧтениеХМЛ);
    ЧтениеХМЛ.Закрыть();
    
    Для каждого Узел Из ДокументДОМ.ДочерниеУзлы Цикл
        Если ТипЗнч(Узел)=Тип("КомментарийDOM") Тогда
            Сообщить(Узел.ЗначениеУзла);
        КонецЕсли;
    КонецЦикла;
16 DS
 
13.10.14
15:38
Это понятно.
Но что будет, если прочитать файл, созданный в (12)?
17 Crush
 
13.10.14
15:46
(16) Он не прочитается, т.к. нет корневого узла.
Нужно так:
дом            = Новый ДокументDOM();
дом.ДобавитьДочерний(дом.СоздатьКомментарий("бла бла бла"));
дом.ДобавитьДочерний(дом.СоздатьЭлемент("Корень"));
ХМЛ=Новый ЗаписьXML;
ХМЛ.ОткрытьФайл(ИмяФайлаВыгрузки);
ЗаписьДОМ=Новый ЗаписьDOM;
ЗаписьДОМ.Записать(дом,ХМЛ);
ХМЛ.Закрыть();
18 DS
 
13.10.14
16:24
Для меня, честно говоря, конструктор "Новый ДокументDOM();" без параметров просто откровение.
19 Crush
 
13.10.14
16:48
(18) :)ага. Сам только обратил внимание.:) в СП описаны два конструктра и минимум два параметра - ОБЯЗАТЕЛЬНЫЕ.
Но, СП - это СП. А Новый ДокументDOM() - это DOM документ:)

Вспомнился анекдот, когда сын программиста спрашивал у папы про движение солца за окном. На что папа выяснил стабильность движения и попросил ничего не трогать, мол пока и так стабильно работает:)
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший