|
Xml.Adaptor класс импорт <=> экспорт
|
|||
---|---|---|---|
#18+
Суть вопроса в том как импортировать данные из Xml в существующий объект У меня есть класс, он передается с сервера на клиент в виде Xml, затем на клиенте Xml может быть модифицирован и в окончании цикла передается обратно на сервер, где он должен быть загружен в объект из которого был сформирован изначально. Однако я не могу загрузить Xml в уже существующий объект У меня есть класс Class Test.XmlSupporter Extends (%Persistent, %XML.Adaptor) { Property A As %String [ InitialExpression = "GGG" ]; Property B As %String [ InitialExpression = "HHH" ]; /// Экспортируем класс в Xml ClassMethod TestExportInstanceToXml() { #Dim obj As XmlSupporter = ##class(XmlSupporter).%New() #Dim xmlView As %String = "" #Dim status As %Status = obj.XMLExportToString(.xmlView) if (status = $$$OK){ Write "XmlView = ",xmlView,! } /// Это работает как надо (!!!) - объект экспортировался /// XmlView = <XmlSupporter><A>GGG</A><B>HHH</B></XmlSupporter> } /// Создаем новый объект из Xml /// (!) Согласно BestPractice InterSystems ClassMethod TestImportNewInstanceFromXml() { #Dim obj As XmlSupporter = $$$NULLOREF #Dim xmlReader As %XML.Reader = ##class(%XML.Reader).%New() #Dim status As %Status = xmlReader.OpenString("<XmlSupporter><A>CCC</A><B>DDD</B></XmlSupporter>") if (status = $$$OK){ Do xmlReader.Correlate("XmlSupporter","Test.XmlSupporter") if (xmlReader.Next(.obj,.status)){ if (status = $$$OK){ // Объект успешно создан Write obj," A = ",obj.A," B = ",obj.B,! } } } /// Это работает как надо (!!!) - объект импортирован и создан /// 3@Test.XmlSupporter A = CCC B = DDD } /// Экспортируем объект в Xml, изменяем его Xml, пытаемся загрузить изменения обратно в объект ClassMethod TestSyncronizeObjectAndXml() { #Dim obj As XmlSupporter = ##class(XmlSupporter).%New() #Dim xmlView As %String = "" #Dim status As %Status = obj.XMLExportToString(.xmlView) if (status = $$$OK){ Set xmlView = $Replace(xmlView,"HHH","KKK") // изменяем один из атрибутов Write "XmlView = ",xmlView,! #Dim xmlReader As %XML.Reader = ##class(%XML.Reader).%New() set status = xmlReader.OpenString(xmlView) if (status = $$$OK){ Set status = obj.XMLImport("XmlSupporter",,,xmlReader.Document) // Вот тут мы спотыкаемся if (status = $$$OK){ Write obj,!," B = ",obj.B,! } else { Do $system.Status.DisplayError(%objlasterror) } } } // А вот тут ТРАБЛА // XmlView = <XmlSupporter><A>GGG</A><B>HHH</B></XmlSupporter> // ОШИБКА #5002: Ошибка: <UNDEFINED>zXMLImport+4^%XML.Adaptor.1 *node } } Кстати такая фишка - InterSystems не рекомендует вызывать XMLImport напрямую, но альтернативы никакой другой я не нашел. Кто можеть помочь? - буду весьма признателен ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2013, 13:52 |
|
Xml.Adaptor класс импорт <=> экспорт
|
|||
---|---|---|---|
#18+
sigmovКстати такая фишка - InterSystems не рекомендует вызывать XMLImport напрямуюПравильно, методы [Internal] лучше не использовать самим. sigmovно альтернативы никакой другой я не нашел.А пример с Correlate() разве не подходит?Class Test.XmlSupporter Extends (%RegisteredObject, %XML.Adaptor) { Property A As %String [ InitialExpression = "GGG" ]; Property B As %String [ InitialExpression = "HHH" ]; /// Экспортируем класс в Xml ClassMethod TestExportInstanceToXml() { Set obj = ##class(XmlSupporter).%New() Set xmlView = "" if $$$ISOK(obj.XMLExportToString(.xmlView)) { Write "XmlView = ",xmlView,! } /* Это работает как надо (!!!) - объект экспортировался XmlView = <XmlSupporter><A>GGG</A><B>HHH</B></XmlSupporter> */ } /// Создаем новый объект из Xml /// (!) Согласно BestPractice InterSystems ClassMethod TestImportNewInstanceFromXml() { #Dim obj As XmlSupporter = $$$NULLOREF Set xmlReader = ##class(%XML.Reader).%New() if $$$ISOK(xmlReader.OpenString("<XmlSupporter><A>CCC</A><B>DDD</B></XmlSupporter>")) { Do xmlReader.Correlate("XmlSupporter",$classname()) if (xmlReader.Next(.obj,.status)){ if $$$ISOK(status) { // Объект успешно создан Do $system.OBJ.Dump(obj) } } } /* Это работает как надо (!!!) - объект импортирован и создан +----------------- general information --------------- | oref value: 3 | class name: Test.XmlSupporter | reference count: 1 +----------------- attribute values ------------------ | A = "CCC" | B = "DDD" */ } /// Экспортируем объект в Xml, изменяем его Xml, пытаемся загрузить изменения обратно в объект ClassMethod TestSyncronizeObjectAndXml() { Set xmlView = "" Set obj = ##class(XmlSupporter).%New() if $$$ISOK(obj.XMLExportToString(.xmlView)){ Write "(До) XmlView = ",xmlView,! Set xmlView = $Replace(xmlView,"HHH","KKK") // изменяем один из атрибутов Write "(После) XmlView = ",xmlView,! Set xmlReader = ##class(%XML.Reader).%New() if $$$ISOK(xmlReader.OpenString(xmlView)) { Write !!,"---- До ----",!! Do $system.OBJ.Dump(obj) Do xmlReader.Correlate("XmlSupporter",$classname()) if (xmlReader.Next(.obj,.status)) // Вот тут мы не спотыкаемся { if $$$ISOK(status) { Write !!,"---- После ----",!! Do $system.OBJ.Dump(obj) } else { Do $system.Status.DisplayError(%objlasterror) } } } } ;А вот тут нет ТРАБЛ } } ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2013, 15:03 |
|
Xml.Adaptor класс импорт <=> экспорт
|
|||
---|---|---|---|
#18+
servit , спасибо за ответ А пример с Correlate() разве не подходит? Дело в том что в примере с Correlate он не загружает Xml в переданный методу объект, а банально присваивает ссылке новый объект и уже в него загружает Xml (т.е. это уже не тот объект который нужно синхронизировать) Нашел какое-никакое решение, унаследовав %XmlReader и изъяв из метода Next все лишнее (пересоздание объекта) Вроде даже работает. Код: Common.Xml.XmlObjectReader Код: python 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2013, 17:47 |
|
|
start [/forum/topic.php?fid=39&msg=38303709&tid=1557137]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
178ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 288ms |
0 / 0 |