Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Импорт XML в Cache / 4 сообщений из 4, страница 1 из 1
22.07.2014, 12:14
    #38702717
iseekyouu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт XML в Cache
Добрый день, столкнулся с проблемой не могу импортировать простенький XML в Cache, XML вида:<response><state attr1="asss" attr2="ssss" attr3="sdssd">deliver</state></response>для импорта создал 2 класса:

Код: plaintext
Class class1 Extends (%Persistent, %XML.Adaptor)
{
Relationship StateInfo As class2 (XMLNAME = "state", XMLPROJECTION = "ELEMENT") [ Cardinality = children, Inverse = ParentLink ];

Код: plaintext
Class class2 Extends (%Persistent, %XML.Adaptor)
{
Property attr1 As %String(XMLNAME = "attr1", XMLPROJECTION = "ATTRIBUTE");
Property attr2 As %String(XMLNAME = "attr2", XMLPROJECTION = "ATTRIBUTE");
Property attr3 As %String(XMLNAME = "attr3", XMLPROJECTION = "ATTRIBUTE");

Relationship ParentLink As class1 [ Cardinality = parent, Inverse = StateInfo ];
}сам импорт:
Код: plaintext
 s reader = ##class(%XML.Reader).%New()
 d reader.OpenStream(stream)
 d reader.Correlate("state","class1")
 while reader.Next(.response,.sc) 
 {
  s attr1=response.attr1
  w "attr1="_attr1,!
 }при запуске программы возникает следующая ошибка:

Код: plaintext
0 ‚n deliver,state (заканчивается в строке 2 символ 77)AXMLImportMalformedNoTag^class1.1:SIRENA

Как я понимаю возникает ошибка из за innerHTML тега state, а как правильно описать его не знаю.. требуется помощь знающих людей :)
...
Рейтинг: 0 / 0
22.07.2014, 14:13
    #38702907
Александр Коблов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт XML в Cache
iseekyouu,

Попробуйте добавить в class2 свойство с XMLPROJECTION = "CONTENT":Property attr4 As %String(XMLPROJECTION = "CONTENT"); http://docs.intersystems.com/cache20141/csp/docbook/DocBook.UI.Page.cls?KEY=GXMLPROJ_basics#GXMLPROJ_B16278

Ну и в самом импорте нужно делать Correlate к тэгу response: d reader.Correlate("response","class1")
 while reader.Next(.response,.sc) 
 {
  w "attr1="_response.StateInfo.GetAt(1).attr1,!
 }
 
...
Рейтинг: 0 / 0
22.07.2014, 15:17
    #38703029
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт XML в Cache
iseekyouu ,

Чтобы понять как импортировать, нужно сначала посмотреть, что получится при экспорте.
class1Class my.class1 Extends (%RegisteredObject, %XML.Adaptor)
{

Relationship StateInfo As my.class2(XMLNAME = "state", XMLPROJECTION = "ELEMENT") [ Cardinality = children, Inverse = ParentLink ];

}class2Class my.class2 Extends (%RegisteredObject, %XML.Adaptor)
{

Property attr1 As %String(XMLNAME = "attr1", XMLPROJECTION = "ATTRIBUTE");

Property attr2 As %String(XMLNAME = "attr2", XMLPROJECTION = "ATTRIBUTE");

Property attr3 As %String(XMLNAME = "attr3", XMLPROJECTION = "ATTRIBUTE");

Property attr4 As %String(XMLPROJECTION = "CONTENT");

Relationship ParentLink As my.class1 [ Cardinality = parent, Inverse = StateInfo ];

}Экспорт  s cl1=##class(my.class1).%New()

  s cl2=##class(my.class2).%New()
  s cl2.attr1="asss"
  s cl2.attr2="ssss"
  s cl2.attr3="sdssd"
  s cl2.attr4="deliver"
  s cl2.ParentLink=cl1

  d cl1.XMLExportToString(.r,"response")
  w r,!

Код: plaintext
1.
USER>d ^test
<response><state attr1="asss" attr2="ssss" attr3="sdssd">deliver</state></response>
Поэтому импорт, может быть следующим:Импорт №1  s reader = ##class(%XML.Reader).%New()
  d reader.OpenString("<response><state attr1=""asss"" attr2=""ssss"" attr3=""sdssd"">deliver</state></response>")
  d reader.Correlate("state","my.class2")
  while reader.Next(.response,.sc) 
  {
    w "attr1="_response.attr1,!
    w "attr2="_response.attr2,!
    w "attr3="_response.attr3,!
    w "attr4="_response.attr4,!
  }
Импорт №2  s reader = ##class(%XML.Reader).%New()
  d reader.OpenString("<response><state attr1=""asss"" attr2=""ssss"" attr3=""sdssd"">deliver</state></response>")
  d reader.Correlate("response","my.class1")
  while reader.Next(.response,.sc) 
  {
    w "attr1="_response.StateInfo.GetAt(1).attr1,!
    w "attr2="_response.StateInfo.GetAt(1).attr2,!
    w "attr3="_response.StateInfo.GetAt(1).attr3,!
    w "attr4="_response.StateInfo.GetAt(1).attr4,!
  }
Код: plaintext
1.
2.
3.
4.
USER>d ^test
attr1=asss
attr2=ssss
attr3=sdssd
attr4=deliver
...
Рейтинг: 0 / 0
23.07.2014, 06:27
    #38703457
iseekyouu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт XML в Cache
Благодарю за помощь!
Не хватало именно CONTENT в class2 :
Код: plaintext
Property state As %String(XMLNAME = "state", XMLPROJECTION = "CONTENT");
class1 - лишний в данной схеме.
Corellate достаточно тогда делать к тегу state сразу:
Код: plaintext
d reader.Correlate("state","class2")
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Импорт XML в Cache / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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