Skip to content

Commit 8767960

Browse files
committed
EvilBeaver#392 Копирование декларации xml и типа документа.
1 parent ce17020 commit 8767960

2 files changed

Lines changed: 90 additions & 23 deletions

File tree

src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,12 @@ public void WriteCurrent(XmlReaderImpl reader)
189189
case XmlNodeType.Element:
190190
CopyElementAndAttributes(reader, this);
191191
break;
192+
case XmlNodeType.XmlDeclaration:
193+
WriteXMLDeclaration();
194+
break;
195+
case XmlNodeType.DocumentType:
196+
CopyDocumentType(reader, this);
197+
break;
192198
case XmlNodeType.Attribute:
193199
WriteAttribute(reader.Name, reader.Value);
194200
break;
@@ -203,6 +209,11 @@ public void WriteCurrent(XmlReaderImpl reader)
203209
}
204210
}
205211

212+
private static void CopyDocumentType(XmlReaderImpl reader, XmlWriterImpl writer)
213+
{
214+
writer.WriteDocumentType(reader.Name, reader.Value);
215+
}
216+
206217
private static void CopyElementAndAttributes(XmlReaderImpl reader, XmlWriterImpl writer)
207218
{
208219
writer.WriteStartElement(reader.Name);

tests/xmlwrite.os

Lines changed: 79 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_КонецЭлемента");
3535
ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_Текст");
3636

37+
ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_ОбъявлениеИТипДокумента");
38+
3739
Возврат ВсеТесты;
3840

3941
КонецФункции
@@ -300,7 +302,9 @@
300302

301303
ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML);
302304

303-
ЧтениеXML.Прочитать();
305+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>");
306+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>");
307+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>");
304308

305309
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
306310
ПолученныйТекст = ЗаписьXML.Закрыть();
@@ -316,8 +320,11 @@
316320

317321
ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML);
318322

319-
ЧтениеXML.Прочитать();
320-
ЧтениеXML.Прочитать();
323+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>");
324+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>");
325+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>");
326+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы);
327+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<data>");
321328

322329
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
323330
ПолученныйТекст = ЗаписьXML.Закрыть();
@@ -333,8 +340,11 @@
333340

334341
ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML);
335342

336-
ЧтениеXML.Прочитать();
337-
ЧтениеXML.Прочитать();
343+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>");
344+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>");
345+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>");
346+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы);
347+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<data>");
338348

339349
ЧтениеXML.ПервыйАтрибут();
340350
ЧтениеXML.СледующийАтрибут();
@@ -354,22 +364,22 @@
354364

355365
ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML);
356366

357-
ЧтениеXML.Прочитать();
358-
ЧтениеXML.Прочитать();
367+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>");
368+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>");
369+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>");
370+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы);
371+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<data>");
359372

360373
ЧтениеXML.ПервыйАтрибут();
361374
ЧтениеXML.СледующийАтрибут();
362375

363376
ЗаписьXML.ЗаписатьНачалоЭлемента("эл");
364377
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
365378

366-
ЧтениеXML.Прочитать();
367-
ЧтениеXML.Прочитать();
368-
ЧтениеXML.Прочитать();
369-
370-
юТест.ПроверитьРавенство(ЧтениеXML.ТипУзла,
371-
ТипУзлаXML.КонецЭлемента,
372-
"Спозиционированы на КонецЭлемента");
379+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.Текст, "Some Value");
380+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.КонецЭлемента, "</data>");
381+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы);
382+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.КонецЭлемента, "</xml>");
373383

374384
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
375385

@@ -386,13 +396,13 @@
386396

387397
ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML);
388398

389-
ЧтениеXML.Прочитать();
390-
ЧтениеXML.Прочитать();
391-
ЧтениеXML.Прочитать();
392-
393-
юТест.ПроверитьРавенство(ЧтениеXML.ТипУзла,
394-
ТипУзлаXML.Текст,
395-
"Спозиционированы на Текст");
399+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>");
400+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>");
401+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>");
402+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы);
403+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<data>");
404+
405+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.Текст, "Спозиционированы на текст Some text");
396406

397407
ЗаписьXML.ЗаписатьНачалоЭлемента("эл");
398408
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
@@ -405,19 +415,65 @@
405415

406416
КонецПроцедуры
407417

418+
Процедура ТестДолжен_ЗаписатьТекущий_ОбъявлениеИТипДокумента() Экспорт
419+
420+
Перем ЧтениеXML, ЗаписьXML;
421+
422+
ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML);
423+
424+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>");
425+
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
426+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>");
427+
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
428+
ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>");
429+
430+
ЗаписьXML.ЗаписатьНачалоЭлемента("эл");
431+
ЗаписьXML.ЗаписатьКонецЭлемента();
432+
433+
ПолученныйТекст = ЗаписьXML.Закрыть();
434+
юТест.ПроверитьРавенствоСтрокБезУчетаРегистра(
435+
"<?xml version=""1.0"" encoding=""UTF-8""?><!DOCTYPE example[]><эл/>",
436+
ПолученныйТекст,
437+
"Объявления и тип документа");
438+
439+
КонецПроцедуры
440+
408441
Процедура ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML)
409442

410443
ПодопытныйТекст =
411-
"<xml xmlns:ns=""ns"" attr=""1"" ns:attr=""value"">
444+
"<?xml version=""1.0"" encoding=""UTF-8""?>
445+
|<!DOCTYPE example SYSTEM ""example.dtd"">
446+
|<xml xmlns:ns=""ns"" attr=""1"" ns:attr=""value"">
412447
| <ns:data inner=""123"" inner2=""456"" inner3=""789"">Some Text</ns:data>
413448
|</xml>"
414449
;
450+
451+
ПараметрыЧтения = Новый ПараметрыЧтенияXml(
452+
, // Версия
453+
, // Язык
454+
, // ПробельныеСимволы
455+
, // ТипПроверкиПравильности,
456+
Ложь, // ИгнорироватьОбъявлениеXML
457+
Ложь, // ИгнорироватьТипДокумента
458+
Ложь, // ИгнорироватьИнструкцииОбработки
459+
Ложь, // ИгнорироватьКомментарии
460+
Ложь, // ИгнорироватьПробельныеСимволы
461+
Ложь, // СекцииCDATAКакТекст
462+
Истина // ИспользоватьИгнорируемыеПробельныеСимволы
463+
);
464+
415465
ЧтениеXML = Новый ЧтениеXML;
416-
ЧтениеXML.УстановитьСтроку(ПодопытныйТекст);
466+
ЧтениеXML.УстановитьСтроку(ПодопытныйТекст, ПараметрыЧтения);
417467

418468
ПараметрыЗаписи = Новый ПараметрыЗаписиXml(, , Ложь); // без переносов
419469

420470
ЗаписьXML = Новый ЗаписьXML;
421471
ЗаписьXML.УстановитьСтроку(ПараметрыЗаписи);
422472

423473
КонецПроцедуры
474+
475+
Процедура ПрочитатьИПроверитьТип(Знач ЧтениеXML, Знач ТипУзла, Знач Сообщение = Неопределено)
476+
ЧтениеXML.Прочитать();
477+
юТест.ПроверитьРавенство(ЧтениеXML.ТипУзла, ТипУзла, Сообщение);
478+
КонецПроцедуры
479+

0 commit comments

Comments
 (0)