Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
 [2014.1] Не полностью читается XData  [new]
coder1cv8
Member

Откуда: Спб
Сообщений: 103
Есть у меня класс, где в XData я хочу хранить много-много текста для начального заполнения чего-то. Например:

XData pass
{
<root>
<item1><![CDATA[
{
  "formatVersion" : 1,
  "passTypeIdentifier" : "pass ...",
  "serialNumber" : "...",
  "teamIdentifier" : "...",
  "locations":[  
   {  
      "longitude":39.926853,
      "latitude":43.427665,
      "relevantText":"..."
   },
... тут еще множество локаций ...
}


Плюс функция, которую я где-то подсмотрел, которая получает эти данные в виде строки из кода:

ClassMethod getNodeText(xdataName As %String, nodeName As %String) As %String
{
	s stream = ##class(%Dictionary.CompiledXData).%OpenId(..%ClassName(1)_"||"_xdataName).Data
	d ##class(%XML.TextReader).ParseStream(stream,.reader)
	
	s text = ""
	while reader.Read() {
		if reader.Name = nodeName {
			d reader.Read()
			s text = reader.Value
			q	
		}
	}
	
	q text
}


Проблем в том, что читается не весь узел, а только часть <item1> из примера. Как это победить?
28 ноя 17, 17:03    [20988960]     Ответить | Цитировать Сообщить модератору
 Re: Не полностью читается XData  [new]
Александр Коблов
Member

Откуда: Краснодар, Москва
Сообщений: 239
coder1cv8,

В 2017.1 (может и раньше) в XData можно json напрямую вставлять:

XData pass [ MimeType = application/json ]
{
{
  "formatVersion" : 1,
  "passTypeIdentifier" : "pass ...",
  "serialNumber" : "...",
  "teamIdentifier" : "...",
  "locations":[  
   {  
      "longitude":39.926853,
      "latitude":43.427665,
      "relevantText":"..."
   }
   ]
 }
}
28 ноя 17, 18:23    [20989237]     Ответить | Цитировать Сообщить модератору
 Re: Не полностью читается XData  [new]
eduard93
Member

Откуда:
Сообщений: 149
Александр Коблов, в XData всегда можно что угодно писать, только не всё подсвечивать будет.

Если нужен json в 2016.1+ можно делать так:
ClassMethod GetJSON() As %DynamicObject [CodeMode=expression]
{
{
  "formatVersion" : 1,
  "passTypeIdentifier" : "pass ..."
}
}
28 ноя 17, 20:23    [20989455]     Ответить | Цитировать Сообщить модератору
 Re: Не полностью читается XData  [new]
coder1cv8
Member

Откуда: Спб
Сообщений: 103
Эм... У меня 2014.1
29 ноя 17, 09:47    [20990587]     Ответить | Цитировать Сообщить модератору
 Re: [2014.1] Не полностью читается XData  [new]
coder1cv8
Member

Откуда: Спб
Сообщений: 103
Дело же тут не совсем в json. Видимо, есть какое-то ограничение в %XML.TextReader, которое не позволяет ему прочесть содержимое элемента целиком.
29 ноя 17, 12:31    [20991385]     Ответить | Цитировать Сообщить модератору
 Re: [2014.1] Не полностью читается XData  [new]
П.С.М.
Member

Откуда: Из СССР
Сообщений: 414
coder1cv8,

Class %XML.TextReader...
{
...
/// Public property, returns the value of the current node. The following types have a value to return:
/// <P>
/// <B>Node Type</B> :: <B>Value</B>
/// <P>
/// attribute :: The value of the attribute. 
/// <P>
/// cdata :: The content of the CDATA section. 
/// <P>
/// comment :: The content of the comment. 
/// <P>
/// processinginstruction :: The entire content of the processing instruction, excluding the target. 
/// <P>
/// ignorablewhitespace :: The white space between markup in a mixed content model. 
/// <P>
/// chars :: The content of the text node. 
/// <P>
/// entity :: The expanded content of the entity 
Property Value As %String;
...
}

/// The <b>%String</b> data type class represents a string.
/// <p>The logical value of the <b>%String</b> data type is a string.
Class %Library.String Extends %DataType [ System = 1 ]
{
/// The maximum number of characters the string can contain.
Parameter MAXLEN As INTEGER = 50;
...
}

Ну и не забываем про ограничения на размер для для локальных переменных )))
29 ноя 17, 14:23    [20992002]     Ответить | Цитировать Сообщить модератору
 Re: [2014.1] Не полностью читается XData  [new]
П.С.М.
Member

Откуда: Из СССР
Сообщений: 414
Да, и судя по реализации метода Read из класса %XML.TextReader, его использование подразумевается следующим образом:
while reader.Read() {
    // читаем порцию данных из reader.Value
    // что-то делаем с прочитанными данными
    // и идем на следующий круг
}
29 ноя 17, 14:53    [20992172]     Ответить | Цитировать Сообщить модератору
 Re: [2014.1] Не полностью читается XData  [new]
coder1cv8
Member

Откуда: Спб
Сообщений: 103
П.С.М.,

а-а-а :) Спасибо!
29 ноя 17, 15:42    [20992474]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить