|
Проецирование класса на XML.
|
|||
---|---|---|---|
#18+
Добрый день! Есть класс: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. Что-то никак не получается. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2013, 11:41 |
|
Проецирование класса на XML.
|
|||
---|---|---|---|
#18+
AlexShiryaevПодскажите, пожалуйста, а то совсем уже запутался с XMLIGNORENULL и XMLNIL. Что-то никак не получается. Предположу, что этому свойству нужно добавить Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2013, 13:13 |
|
Проецирование класса на XML.
|
|||
---|---|---|---|
#18+
AlexShiryaev , приветствую Я сколько ни пытался, тоже "словить" пустой элемент не получалось, либо тег(атрибут) вообще не создается(XMLNIL = 0) либо тегу добавляется атрибут nil=true (XMLNIL = 1) XMLNIL = 0 Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
XMLNIL = 1 Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Кстати, кикто не знает как убрать пространство имен xlmns:d5p1? - а то оно только мешает ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2013, 07:52 |
|
Проецирование класса на XML.
|
|||
---|---|---|---|
#18+
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> ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2013, 10:43 |
|
Проецирование класса на XML.
|
|||
---|---|---|---|
#18+
servit Код: vbnet 1.
Т.е. необходимо таки добавить один пустой элемент? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2013, 11:00 |
|
Проецирование класса на XML.
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2013, 11:12 |
|
Проецирование класса на XML.
|
|||
---|---|---|---|
#18+
krvsaТ.е. необходимо таки добавить один пустой элемент? Default XML Projections of Empty Strings and Null Values ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2013, 11:15 |
|
Проецирование класса на XML.
|
|||
---|---|---|---|
#18+
Код: sql 1.
Тоже о чем-то подобном думал, но не думал, что можно вызвать Insert() без аргументов вообще. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2013, 11:36 |
|
Проецирование класса на XML.
|
|||
---|---|---|---|
#18+
AlexShiryaevне думал, что можно вызвать Insert() без аргументов вообщеInsert() === Insert("") ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2013, 11:43 |
|
Проецирование класса на XML.
|
|||
---|---|---|---|
#18+
servit Код: python 1. 2. 3. 4. 5.
Код: xml 1. 2.
Ну вот, собственно о чем и речь, Вы добавили 1 элемент в список (могли еще N "" заинсертить) а он в xml спроектировал что список пуст(не содержит элементов), хотя "по-феншуй" требовалось: Код: xml 1. 2.
автор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 при сохранении объекта ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2013, 16:08 |
|
Проецирование класса на XML.
|
|||
---|---|---|---|
#18+
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 %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 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2013, 13:58 |
|
|
start [/forum/moderation_log.php?user_name=alex_dorin]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
157ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 440ms |
total: | 715ms |
0 / 0 |