powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Пытаюсь работать парсить XML классом %XML.TextReader
22 сообщений из 22, страница 1 из 1
Пытаюсь работать парсить XML классом %XML.TextReader
    #36547598
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странный он какой-то, не могу разобраться с навигацией:

делаю MoveToContent, он проскакивает текущий узел и идет до узла, где есть этот контент.
При этом можно теоретически конечно пользоваться свойством IsEmptyElement, но тогда непонятно, то ли оно ложно потому что у элемента есть содержимое, то ли оно ложно потому что у элемента есть дочерние узлы.

Или есть смысл использовать что-то другое, не %XML.TextReader?

Cache for Windows (x86-32) 2009.1 (Build 446) Thu Jul 9 2009 17:01:44 EDT
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36547691
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде как с использованием %XML.SAX.Parser
можно написать обработчики которые будут срабатывать кода парсер натыкается на тот или иной элемент
есть еще вариант, можно создать под XML класс(ы) в Cache, с соблюдением структуры xml
и загружать уже средствами Cache сразу в класс через %XML.Reader
но такой вариант больше подходит для более менее простых XML файлов, с простой структурой

_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36547744
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня структура простая, максимум двухуровневая, другое дело, что видов структур много получается. Пока на каждую пишу свой парсер, не особо хорошо.
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36547756
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда стоит наверно все таки на классы сделать
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36569829
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DAiMor,

может xml файл приложете?
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36569956
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=Dimon=DAiMor,

может xml файл приложете?
что-то мне подсказывает, что обращение не ко мне, а если ко мне то какой вам файл выложить ?
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36570441
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, наверно все-таки ко мне :-)
Сейчас пока то что есть хоть и коряво допинал,
надо будет как-нибудь поразбираться с классом, там вроде как много чего есть.
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36571690
Блок А.Н.,

а XML-схема есть для импортируемых файлов? Может через нее классов для загрузки нагенерить?
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36571773
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, xml-схемы нет, я по-видимому не очень в этом силен :-(

там данные простые, и в принципе двух типов
<?xml ...>
<reply>
<data attribute=att1>текст</data>
<data attribute=att2>текст</data>
...
<data attribute=att3>текст</data>
<paramname1>текст</paramname1>
<paramname2>текст</paramname2>
...
<paramnameN>текст</paramnameN>
</reply>

в разных вариантах ответа может не быть атрибутов или каких-то тегов, теги внутри быть пустыми, набор тегов немного меняется. В принципе я разбираю и на коленке, но похоже там все сложнее и возможностей больше.
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36581357
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделываю все потихоньку на объекты
(%XML.Reader, %XML.Writer)
На удивление проще и приятней чем парсить руками - запихать все данные в объект и потом на другой стороне его оттуда вытащить. Притом незаполненные поля не передаются, так что можно с запасом натолкать в объект полей (в том числе массивов) - лишнего трафика не будет.

Пока только натолкнулся на то, что не всегда распаковывает нормально, иногда затыкается.
В частности хотел передавать массив неопределенных данных, и при передаче списков он иногда затыкался.
Сначала поле было %String, оно его никак не кодировало, в результате при разборе XML ридер затыкался на непонятных для него символах. Ладно, фиг с ним, сделал %Binary. Бинарный кодируется в Base64, там левых символов не должно быть, но почему-то все равно ридер иногда спотыкался. Сделал тип %List - стало все нормально. Но теперь, я думаю, кроме списка туда ничего нельзя подавать? В общем, пока есть сомнения, что все будет без сбоев.

Но способ удобный :-)
Меняешь тип поля передавемого поля - сразу меняется способ его кодирования как на входе, так и на выходе, ничего дополнительно делать не надо.
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36581786
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вот например передаю список, он кодируется как строка с точкой с запятой.
а в этом спике строка с запятыми, так он считает, что это не строка с запятыми, а большой список.

И опять же непонятно, че он спотыкается на %Binary?
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36581809
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее оно же не не само (надеюсь) на каждый тип данных придумывает как закодировать значения?
Оно наверно использует метод LogicalToXSD?
То есть в принципе можно сделать свой тип данных, чтобы быть точно уверенным, что оно без ошибок будет кодироваться и раскодироваться?
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36581842
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С тем же бинарным тоже в принципе понятно:
но кодирует данные с переводом строк, а потом ридер не может понять, зачем тут эти переводы строк. Но как обойти?
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36582026
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Была немного похожая проблема.
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36582156
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создал класс-пустышку с [ClassType = datatype],
Сделал в классе поля этим типом.
Стало кодировать его как %Binary, но в отличии от %Binary экспортирует без переводов строк и не давится при импорте.
Вроде работает :-)
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36585922
А можно пример данных, которые затык вызывали? Ну и класса, экспорт из которого к такому затыку приводил.
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36586074
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сейчас не на работе, да и рабочий класс смысла нет присылать, сделал миникласс, смысл тот же.

Класс данных
Код: plaintext
1.
2.
3.
4.
Class Test.Reply Extends (%XML.Adaptor,%RegisteredObject)
{
 Property Data as %Binary;
}

Класс запросов:
Код: plaintext
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.
Class Test.Remote Extends %CSP.Page
{

Parameter CONTENTTYPE = "text/xml";

ClassMethod OnPage() As %Status
{
 s key=%request.Get("key")
 s reply=##class(Test.Reply).%New()
 //генерим всякую чушь
 while (key>$l(reply.Data)) 
 	{s reply.Data=reply.Data_$l(reply.Data)
 	} 
 s writer=##class(%XML.Writer).%New()
 d writer.OutputToDevice()
 s writer.Charset="windows-1251"
 d writer.StartDocument()
 d writer.RootObject(reply)
 d writer.EndDocument()
 
 q  1 
}

ClassMethod GetData(IP as %String,NS as %String, Key as %String)
{
 s reader=##class(%XML.Reader).%New()
 s url="http://"_IP_"/"_NS_"/Test.Remote.cls?key="_Key
 w !,url
 s st=reader.OpenURL(url)
 w !,"Статус ридера:",##class(%Status).LogicalToOdbc(st)
 d reader.CorrelateRoot("Test.Reply")	
 d reader.Next(.reply,.st)
 w !,"Статус парсер:",##class(%Status).LogicalToOdbc(st)
 w:$g(reply)'="" !,"Полученные данные:",reply.Data
}

}

Результаты запусков (третий параметр позволяет регулировать длину данных в ответе)
Удачный:
авторUSER>d ##class(Test.Remote).GetData("127.0.0.1","csp/user",50)
http://127.0.0.1/csp/user/Test.Remote.cls?key=50
Статус ридера:1
Статус парсер:1
Полученные данные:01234567891012141618202224262830323436384042444648

Неудачный:
авторUSER>d ##class(Test.Remote).GetData("127.0.0.1","csp/user",100)

http://127.0.0.1/csp/user/Test.Remote.cls?key=100
Статус ридера:1
Статус парсер:ОШИБКА #6232: Проверка типа данных завершилась неудачей для тега, Data (заканчивается в строке 2 символ 14), со значением: MDEyMzQ1Njc4OTEwMTIxNDE2MTgyMDIyMjQyNjI4MzAzMjM0MzYzODQwNDI0NDQ2NDg1MDUyNTQ1
NjU4NjA2MjY0NjY2ODcwNzI3NDc2Nzg4MDgyODQ4Njg4OTA5Mjk0OTY5OA==
Полученные данные:


Сам XML-документ выглядит так:
автор<?xml version="1.0" encoding="windows-1251" ?>
<Reply><Data>MDEyMzQ1Njc4OTEwMTIxNDE2MTgyMDIyMjQyNjI4MzAzMjM0MzYzODQwNDI0NDQ2NDg1MDUyNTQ1 NjU4NjA2MjY0NjY2ODcwNzI3NDc2Nzg4MDgyODQ4Njg4OTA5Mjk0OTY5ODEwMDEwMzEwNjEwOTEx MjExNTExODEyMTEyNDEyNzEzMDEzMzEzNjEzOTE0MjE0NTE0ODE1MTE1NDE1NzE2MDE2MzE2NjE2 OTE3MjE3NTE3ODE4MTE4NDE4NzE5MDE5MzE5NjE5OQ==</Data></Reply>
Переводы строк именно так и есть, и перевод строки внутри элемента вызывает затыкание.
Переводится при длине исходных данных больше 50 символов.
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36586084
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, на работе сделано через Correlate, а дома через CorrelateRoot
дома каше 2007, на работе каше 2009.1.3
Текст и смысл ошибки одинаковый.
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36586180
По MAXLEN падает. Если поставить MAXLEN у поля Data в классе Test.Reply больше 50 - не будет и переносов, и ошибок.
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36586192
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дома ошибка решается через замену класса %Binary на такой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Class Test.Data [ ClassType = datatype ]
{
 //parameter XSDTYPE = "base64Binary";

classmethod LogicalToXSD(%val As Test.Data) as %String
{
	s %val=$system.Encryption.Base64Encode(%val)
	s %val=$tr(%val,$c( 10 )_$c( 13 )_$c( 14 ),"")
	q %val
}

classmethod XSDToLogical(%val As %String) as Test.Data
{
 s %val=$system.Encryption.Base64Decode(%val)
 q %val
}
}
На работе кстати все содержимое закомментарил, но оно продолжило работать как надо.
Судя по всемя это просто глюк, связанный с тем, что где-то остались скомпиленные программы.
строчка
s %val=$tr(%val,$c(10)_$c(13)_$c(14),"")
кстати совсем не обязательна. Почему-то с этим классом на переводах строк не давится, пропускает нормально.
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36586201
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, и правда MAXLEN в %Binary имеет значение, ни за что бы не подумал.
Ошибка при больших MAXLEN пропадает (а больше 32000 все равно туда не вместится наверно)
...
Рейтинг: 0 / 0
Пытаюсь работать парсить XML классом %XML.TextReader
    #36586202
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Пытаюсь работать парсить XML классом %XML.TextReader
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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