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

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

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

Cache for Windows (x86-32) 2009.1 (Build 446) Thu Jul 9 2009 17:01:44 EDT
...
Рейтинг: 0 / 0
29.03.2010, 11:11
    #36547691
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пытаюсь работать парсить XML классом %XML.TextReader
вроде как с использованием %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
29.03.2010, 11:33
    #36547744
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пытаюсь работать парсить XML классом %XML.TextReader
У меня структура простая, максимум двухуровневая, другое дело, что видов структур много получается. Пока на каждую пишу свой парсер, не особо хорошо.
...
Рейтинг: 0 / 0
29.03.2010, 11:38
    #36547756
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пытаюсь работать парсить XML классом %XML.TextReader
тогда стоит наверно все таки на классы сделать
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
09.04.2010, 06:56
    #36569829
=Dimon=
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пытаюсь работать парсить XML классом %XML.TextReader
DAiMor,

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

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

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

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

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

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

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

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

Класс данных
Код: 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
19.04.2010, 17:24
    #36586084
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пытаюсь работать парсить XML классом %XML.TextReader
Да, на работе сделано через Correlate, а дома через CorrelateRoot
дома каше 2007, на работе каше 2009.1.3
Текст и смысл ошибки одинаковый.
...
Рейтинг: 0 / 0
19.04.2010, 17:58
    #36586180
Пытаюсь работать парсить XML классом %XML.TextReader
По MAXLEN падает. Если поставить MAXLEN у поля Data в классе Test.Reply больше 50 - не будет и переносов, и ошибок.
...
Рейтинг: 0 / 0
19.04.2010, 18:03
    #36586192
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пытаюсь работать парсить XML классом %XML.TextReader
Дома ошибка решается через замену класса %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
19.04.2010, 18:05
    #36586201
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пытаюсь работать парсить XML классом %XML.TextReader
Хм, и правда MAXLEN в %Binary имеет значение, ни за что бы не подумал.
Ошибка при больших MAXLEN пропадает (а больше 32000 все равно туда не вместится наверно)
...
Рейтинг: 0 / 0
19.04.2010, 18:06
    #36586202
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пытаюсь работать парсить XML классом %XML.TextReader
Спасибо!
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Пытаюсь работать парсить XML классом %XML.TextReader / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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