Skip to content

Commit c9c832f

Browse files
committed
EvilBeaver#392: ЗаписатьТекущий пишет только текущее состояние.
1 parent 14fb358 commit c9c832f

2 files changed

Lines changed: 182 additions & 1 deletion

File tree

src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,39 @@ public void WriteText(string text)
183183
[ContextMethod("ЗаписатьТекущий","WriteCurrent")]
184184
public void WriteCurrent(XmlReaderImpl reader)
185185
{
186-
_writer.WriteNode(reader.GetNativeReader(), false);
186+
var nodeType = reader.NodeType.UnderlyingValue;
187+
switch (nodeType)
188+
{
189+
case XmlNodeType.Element:
190+
CopyElementAndAttributes(reader, this);
191+
break;
192+
case XmlNodeType.Attribute:
193+
WriteAttribute(reader.Name, reader.Value);
194+
break;
195+
case XmlNodeType.EndElement:
196+
WriteEndElement();
197+
break;
198+
case XmlNodeType.Text:
199+
WriteText(reader.Value);
200+
break;
201+
default:
202+
break;
203+
}
204+
}
205+
206+
private static void CopyElementAndAttributes(XmlReaderImpl reader, XmlWriterImpl writer)
207+
{
208+
writer.WriteStartElement(reader.Name);
209+
var attributeCount = reader.AttributeCount();
210+
if (attributeCount != 0)
211+
{
212+
for (var attributeIndex = 0; attributeIndex < attributeCount; attributeIndex++)
213+
{
214+
var attributeName = reader.AttributeName(attributeIndex);
215+
var attributeValue = reader.GetAttribute(ValueFactory.Create(attributeIndex));
216+
writer.WriteAttribute(attributeName, attributeValue.ExplicitString());
217+
}
218+
}
187219
}
188220

189221
[ContextMethod("ЗаписатьТипДокумента","WriteDocumentType")]

tests/xmlwrite.os

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,16 @@
2626
ВсеТесты.Добавить("ТестДолжен_ЗаписатьВСтрокуБезПробелаПередЗакрытием");
2727
ВсеТесты.Добавить("ТестДолжен_ПроверитьПравильныйВыводПробелСлэша");
2828
ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекст");
29+
30+
ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_БезЧтения");
31+
ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_НачалоЭлемента");
32+
ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_НачалоВложенногоЭлемента");
33+
ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлемента");
34+
ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_КонецЭлемента");
35+
ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_Текст");
2936

3037
Возврат ВсеТесты;
38+
3139
КонецФункции
3240

3341
Процедура ТестДолжен_ЗаписатьВСтроку() Экспорт
@@ -272,3 +280,144 @@
272280
юТест.ПроверитьРавенство(Результат, "<root>123</root>");
273281

274282
КонецПроцедуры
283+
284+
285+
Процедура ТестДолжен_ЗаписатьТекущий_БезЧтения() Экспорт
286+
287+
Перем ЧтениеXML, ЗаписьXML;
288+
289+
ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML);
290+
291+
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
292+
ПолученныйТекст = ЗаписьXML.Закрыть();
293+
юТест.ПроверитьРавенство("", ПолученныйТекст, "Ничего не прочитано - ничего не пишется");
294+
295+
КонецПроцедуры
296+
297+
Процедура ТестДолжен_ЗаписатьТекущий_НачалоЭлемента() Экспорт
298+
299+
Перем ЧтениеXML, ЗаписьXML;
300+
301+
ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML);
302+
303+
ЧтениеXML.Прочитать();
304+
305+
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
306+
ПолученныйТекст = ЗаписьXML.Закрыть();
307+
юТест.ПроверитьРавенство("<xml xmlns:ns=""ns"" attr=""1"" ns:attr=""value"" />", // dotnet автоматом закроет элемент
308+
ПолученныйТекст,
309+
"Первый элемент");
310+
311+
КонецПроцедуры
312+
313+
Процедура ТестДолжен_ЗаписатьТекущий_НачалоВложенногоЭлемента() Экспорт
314+
315+
Перем ЧтениеXML, ЗаписьXML;
316+
317+
ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML);
318+
319+
ЧтениеXML.Прочитать();
320+
ЧтениеXML.Прочитать();
321+
322+
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
323+
ПолученныйТекст = ЗаписьXML.Закрыть();
324+
юТест.ПроверитьРавенство("<ns:data inner=""123"" inner2=""456"" inner3=""789"" />", // dotnet автоматом закроет элемент
325+
ПолученныйТекст,
326+
"Второй элемент");
327+
328+
КонецПроцедуры
329+
330+
Процедура ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлемента() Экспорт
331+
332+
Перем ЧтениеXML, ЗаписьXML;
333+
334+
ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML);
335+
336+
ЧтениеXML.Прочитать();
337+
ЧтениеXML.Прочитать();
338+
339+
ЧтениеXML.ПервыйАтрибут();
340+
ЧтениеXML.СледующийАтрибут();
341+
342+
ЗаписьXML.ЗаписатьНачалоЭлемента("эл");
343+
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
344+
ПолученныйТекст = ЗаписьXML.Закрыть();
345+
юТест.ПроверитьРавенство("<эл inner2=""456"" />", // dotnet автоматом закроет элемент
346+
ПолученныйТекст,
347+
"Второй атрибут");
348+
349+
КонецПроцедуры
350+
351+
Процедура ТестДолжен_ЗаписатьТекущий_КонецЭлемента() Экспорт
352+
353+
Перем ЧтениеXML, ЗаписьXML;
354+
355+
ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML);
356+
357+
ЧтениеXML.Прочитать();
358+
ЧтениеXML.Прочитать();
359+
360+
ЧтениеXML.ПервыйАтрибут();
361+
ЧтениеXML.СледующийАтрибут();
362+
363+
ЗаписьXML.ЗаписатьНачалоЭлемента("эл");
364+
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
365+
366+
ЧтениеXML.Прочитать();
367+
ЧтениеXML.Прочитать();
368+
ЧтениеXML.Прочитать();
369+
370+
юТест.ПроверитьРавенство(ЧтениеXML.ТипУзла,
371+
ТипУзлаXML.КонецЭлемента,
372+
"Спозиционированы на КонецЭлемента");
373+
374+
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
375+
376+
ПолученныйТекст = ЗаписьXML.Закрыть();
377+
юТест.ПроверитьРавенство("<эл inner2=""456""/>",
378+
ПолученныйТекст,
379+
"Закрытие элемента");
380+
381+
КонецПроцедуры
382+
383+
Процедура ТестДолжен_ЗаписатьТекущий_Текст() Экспорт
384+
385+
Перем ЧтениеXML, ЗаписьXML;
386+
387+
ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML);
388+
389+
ЧтениеXML.Прочитать();
390+
ЧтениеXML.Прочитать();
391+
ЧтениеXML.Прочитать();
392+
393+
юТест.ПроверитьРавенство(ЧтениеXML.ТипУзла,
394+
ТипУзлаXML.Текст,
395+
"Спозиционированы на Текст");
396+
397+
ЗаписьXML.ЗаписатьНачалоЭлемента("эл");
398+
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
399+
ЗаписьXML.ЗаписатьКонецЭлемента();
400+
401+
ПолученныйТекст = ЗаписьXML.Закрыть();
402+
юТест.ПроверитьРавенство("<эл>Some Text</эл>",
403+
ПолученныйТекст,
404+
"Текст");
405+
406+
КонецПроцедуры
407+
408+
Процедура ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML)
409+
410+
ПодопытныйТекст =
411+
"<xml xmlns:ns=""ns"" attr=""1"" ns:attr=""value"">
412+
| <ns:data inner=""123"" inner2=""456"" inner3=""789"">Some Text</ns:data>
413+
|</xml>"
414+
;
415+
ЧтениеXML = Новый ЧтениеXML;
416+
ЧтениеXML.УстановитьСтроку(ПодопытныйТекст);
417+
418+
ПараметрыЗаписи = Новый ПараметрыЗаписиXml(, , Ложь); // без переносов
419+
420+
ЗаписьXML = Новый ЗаписьXML;
421+
ЗаписьXML.УстановитьСтроку(ПараметрыЗаписи);
422+
423+
КонецПроцедуры

0 commit comments

Comments
 (0)