powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Проецирование класса на XML.
11 сообщений из 11, страница 1 из 1
Проецирование класса на XML.
    #38426278
AlexShiryaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Есть класс:Class MyClass Extends (%SerialObject, %XML.Adaptor)
{
Property Property1 As %Integer(XMLPROJECTION = "ATTRIBUTE");

Property Errors As list Of %String(MAXLEN = 250, STORAGEDEFAULT = "array");
}
Нужно, чтобы при выводе в XML, если Errors не содержит элементов, то выводились пустые теги <Errors>
Например:<MyClass Property1="25">
<Errors>
</Errors>
</MyClass>
Пример кода: set cl=##class(MyClass).%New()
 set cl.Property1=25
 set writer=##class(%XML.Writer).%New()
 set status=writer.OutputToFile(file)
 set status=writer.RootObject(cl)
Подскажите, пожалуйста, а то совсем уже запутался с XMLIGNORENULL и XMLNIL. Что-то никак не получается.
...
Рейтинг: 0 / 0
Проецирование класса на XML.
    #38426494
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexShiryaevПодскажите, пожалуйста, а то совсем уже запутался с XMLIGNORENULL и XMLNIL. Что-то никак не получается.
Предположу, что этому свойству нужно добавить
Код: vbnet
1.
XMLNIL = 1
...
Рейтинг: 0 / 0
Проецирование класса на XML.
    #38427521
sigmov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexShiryaev , приветствую

Я сколько ни пытался, тоже "словить" пустой элемент не получалось, либо тег(атрибут) вообще не создается(XMLNIL = 0) либо тегу добавляется атрибут nil=true (XMLNIL = 1)

XMLNIL = 0
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<X.XPers Class="X.XPers" Id="3" Guid="42357808-5D1B-4468-9B11-7096D188F948" XTimeStamp="2013-10-09T15:52:33" XInt="11">
  <XListOfStr>
    <item>aaa</item>
    <item>bbb</item>
  </XListOfStr>
  <XListOfNot>
    <item>BDE94C5D-185E-4A84-9645-51DFA082DEEC</item>
    <item>8183CCBD-A924-4676-A935-30980ADCF1FC</item>
  </XListOfNot>
  <XArrOfNot>
    <item key="1">EF98D725-C14B-4CDD-8BAE-F5676F94794B</item>
    <item key="2">D4BED64B-21A5-471F-A8DD-ADD7B794A3BF</item>
  </XArrOfNot>
</X.XPers>



XMLNIL = 1
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<X.XPers Class="X.XPers" Id="3" Guid="42357808-5D1B-4468-9B11-7096D188F948" XTimeStamp="2013-10-09T15:52:33" XInt="11">
  <XListOfStr>
    <item>aaa</item>
    <item>bbb</item>
    <item d5p1:nil="true" xmlns:d5p1="http://www.w3.org/2001/XMLSchema-instance"/>
  </XListOfStr>
  <XListOfNot>
    <item>BDE94C5D-185E-4A84-9645-51DFA082DEEC</item>
    <item>8183CCBD-A924-4676-A935-30980ADCF1FC</item>
  </XListOfNot>
  <XArrOfNot>
    <item key="1">EF98D725-C14B-4CDD-8BAE-F5676F94794B</item>
    <item key="2">D4BED64B-21A5-471F-A8DD-ADD7B794A3BF</item>
    <item key="3" d5p1:nil="true" xmlns:d5p1="http://www.w3.org/2001/XMLSchema-instance"/>
    <item key="5" d5p1:nil="true" xmlns:d5p1="http://www.w3.org/2001/XMLSchema-instance"/>
    <item key="6" d5p1:nil="true" xmlns:d5p1="http://www.w3.org/2001/XMLSchema-instance"/>
  </XArrOfNot>
</X.XPers>



Кстати, кикто не знает как убрать пространство имен xlmns:d5p1? - а то оно только мешает
...
Рейтинг: 0 / 0
Проецирование класса на XML.
    #38427723
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexShiryaev ,
Class MyClass Extends (%SerialObject, %XML.Adaptor)
{

Property Property1 As %Integer(XMLPROJECTION = "ATTRIBUTE");

Property Errors As list Of %String(MAXLEN = 250, XMLNIL = 0);

}set cl=##class(MyClass).%New()
set cl.Property1=25
do:cl.Errors.Count()=0 cl.Errors.Insert()
set writer=##class(%XML.Writer).%New()
do writer.RootObject(cl)
Результат:<?xml version="1.0" encoding="UTF-8"?>
<MyClass Property1="25"><Errors></Errors></MyClass>
...
Рейтинг: 0 / 0
Проецирование класса на XML.
    #38427753
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit
Код: vbnet
1.
do:cl.Errors.Count()=0 cl.Errors.Insert()


Т.е. необходимо таки добавить один пустой элемент?
...
Рейтинг: 0 / 0
Проецирование класса на XML.
    #38427778
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sigmovЯ сколько ни пытался, тоже "словить" пустой элемент не получалось, либо тег(атрибут) вообще не создается(XMLNIL = 0) либо тегу добавляется атрибут nil=true (XMLNIL = 1)
set cl=##class(MyClass).%New()
set cl.Property1=25
do cl.Errors.Insert("1")
do cl.Errors.Insert("2")
do cl.Errors.Insert($c(0))
do cl.Errors.Insert($c(0))
do cl.Errors.Insert($c(0))
set writer=##class(%XML.Writer).%New()
do writer.RootObject(cl)<?xml version="1.0" encoding="UTF-8"?>
<MyClass Property1="25">
<Errors>
  <ErrorsItem>1</ErrorsItem>
  <ErrorsItem>2</ErrorsItem>
  <ErrorsItem></ErrorsItem>
  <ErrorsItem></ErrorsItem>
  <ErrorsItem></ErrorsItem>
</Errors>
</MyClass>
Handling Empty Strings and Null Values
...
Рейтинг: 0 / 0
Проецирование класса на XML.
    #38427789
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaТ.е. необходимо таки добавить один пустой элемент? Default XML Projections of Empty Strings and Null Values
...
Рейтинг: 0 / 0
Проецирование класса на XML.
    #38427836
AlexShiryaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
do:cl.Errors.Count()=0 cl.Errors.Insert()



Тоже о чем-то подобном думал, но не думал, что можно вызвать Insert() без аргументов вообще.
Спасибо.
...
Рейтинг: 0 / 0
Проецирование класса на XML.
    #38427852
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexShiryaevне думал, что можно вызвать Insert() без аргументов вообщеInsert() === Insert("")
...
Рейтинг: 0 / 0
Проецирование класса на XML.
    #38428445
sigmov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit
Код: python
1.
2.
3.
4.
5.
set cl=##class(MyClass).%New()
set cl.Property1=25
do:cl.Errors.Count()=0 cl.Errors.Insert()
set writer=##class(%XML.Writer).%New()
do writer.RootObject(cl)

Код: xml
1.
2.
<?xml version="1.0" encoding="UTF-8"?>
<MyClass Property1="25"><Errors></Errors></MyClass>

Ну вот, собственно о чем и речь, Вы добавили 1 элемент в список (могли еще N "" заинсертить) а он в xml спроектировал что список пуст(не содержит элементов), хотя "по-феншуй" требовалось:
Код: xml
1.
2.
<?xml version="1.0" encoding="UTF-8"?>
<MyClass Property1="25"><Errors><ErrorsItem></ErrorsItem></Errors></MyClass>



авторset cl=##class(MyClass).%New()
set cl.Property1=25
do cl.Errors.Insert("1")
do cl.Errors.Insert("2")
do cl.Errors.Insert($c(0))
do cl.Errors.Insert($c(0))
do cl.Errors.Insert($c(0))
set writer=##class(%XML.Writer).%New()
do writer.RootObject(cl)
Интересная задумка, возможно получится использовать в качестве костылика, но:
1. ($c(0) == "") => 0 т.е. $c(0) это не NULL
2. если просетить $c(0) свойство, к примеру, %Integer то оно выдаст ошибку Validation при сохранении объекта
...
Рейтинг: 0 / 0
Проецирование класса на XML.
    #38429657
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sigmov1. ($c(0) == "") => 0 т.е. $c(0) это не NULLВсё верно: Caché, в отличие от Oracle, различает пустое значение (null) от пустой строки (""), отсюда и разное представление этих двух значений в XML. Поэтому чтобы не путаться, предпочтительно в коде использовать макросы $$$NULL и $$$EMPTYSTR.
sigmov2. если просетить $c(0) свойство, к примеру, %Integer то оно выдаст ошибку Validation при сохранении объектаГлупо числовому полю присваивать строковое значение.
И потом, как определить какое значение имелось в виду при <intItem></intItem>: 0 или null?
sigmovа он в xml спроектировал что список пуст(не содержит элементов), хотя "по-феншуй" требовалось:"по-феншуй" достигается заменой cl.Errors.Insert() на cl.Errors.Insert($c(0)), а зачем ТС нужен был именно такой формат XML пусть останется при нём.
sigmovКстати, кикто не знает как убрать пространство имен xlmns:d5p1? - а то оно только мешает
Например, такClass demo.myclass Extends (%SerialObject, %XML.Adaptor)
{
Property XArrOfNot As array Of %String(XMLITEMNAME = "item", XMLKEYNAME = "key");
}
  #Include %occStatus
  #Include %sqlMigration

  set cl=##class(demo.myclass).%New()
  do cl.XArrOfNot.SetAt("EF98D725-C14B-4CDD-8BAE-F5676F94794B","1")
  do cl.XArrOfNot.SetAt("D4BED64B-21A5-471F-A8DD-ADD7B794A3BF","2")

  do cl.XArrOfNot.SetAt(,"3")
  do cl.XArrOfNot.SetAt($$$NULL,"5")
  do cl.XArrOfNot.SetAt("","6")

  do cl.XArrOfNot.SetAt($$$EMPTYSTR,"7")

  set ns=##class(%XML.Namespaces).%New()
  set ns.OutputTypeAttribute=$$$YES

  do $system.OBJ.DisplayError(cl.XMLExportToString(.s,,"literal,indent"))  write s,!!
  do $system.OBJ.DisplayError(cl.XMLExportToString(.s,,"literal,indent",ns)) write s,!!Результат<myclass>
  <XArrOfNot>
    <item key="1">EF98D725-C14B-4CDD-8BAE-F5676F94794B</item>
    <item key="2">D4BED64B-21A5-471F-A8DD-ADD7B794A3BF</item>
    <item key="3" d5p1:nil="true" xmlns:d5p1=" http://www.w3.org/2001/XMLSchema-instance" />
    <item key="5" d5p1:nil="true" xmlns:d5p1=" http://www.w3.org/2001/XMLSchema-instance" />
    <item key="6" d5p1:nil="true" xmlns:d5p1=" http://www.w3.org/2001/XMLSchema-instance" />
    <item key="7"></item>
  </XArrOfNot>
</myclass>

<myclass xmlns:s=" http://www.w3.org/2001/XMLSchema"  xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" >
  <XArrOfNot>
    <item key="1">EF98D725-C14B-4CDD-8BAE-F5676F94794B</item>
    <item key="2">D4BED64B-21A5-471F-A8DD-ADD7B794A3BF</item>
    <item key="3" xsi:nil="true"/>
    <item key="5" xsi:nil="true"/>
    <item key="6" xsi:nil="true"/>
    <item key="7"></item>
  </XArrOfNot>
</myclass>Или можно как у ТС  set writer=##class(%XML.Writer).%New()
  set writer.Indent=$$$YES
  set writer.OutputTypeAttribute=$$$YES
  do writer.RootObject(cl) Exporting Type Information
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Проецирование класса на XML.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]