Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка очень интеренсого по формату XML, [D7, WinXP]


Страницы:   1 2

D-Rulez ©   (2012-04-03 17:39:00) 

Здравствуйте. Помогите, пожалуйста, следующий xml обработать и через clientdataset в dbgrid отобразить данные.

XML файл очень интересного типа. Его не может обработать XML Mapper: Выдает ошибку на строке 69 из-за длины строки (это значение AtrName11=max8000).
Хотелось бы как-то обработать данный xml и значения атрибутов с AtrName1 по AtrName13 – отобразить в dbgrid.

Проблема еще и в том, что хотя и некоторые атрибуты описаны в схеме, но их значений может и не быть, как AtrName5, например, в этом случае их можно заменить пустым значением NULL.

Как и чем можно обработать данный xml файл? Может компонента есть, которая сможет такое проглотить?
Или хоты бы как-то получить сами значения, или отсутствие атрибутов по отдельности из z:row?

Пример самого xml:

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly'>
 <s:AttributeType name='AtrName1' rs:number='1' rs:writeunknown='true'>
  <s:datatype dt:type='int' dt:maxLength='4' rs:precision='10'
   rs:fixedlength='true' rs:maybenull='false'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName2' rs:number='2' rs:writeunknown='true'>
  <s:datatype dt:type='ui1' dt:maxLength='1' rs:precision='3'
   rs:fixedlength='true' rs:maybenull='false'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName3' rs:number='3' rs:nullable='true'
   rs:writeunknown='true'>
  <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='128'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName4' rs:number='4' rs:writeunknown='true'>
  <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='128'
   rs:maybenull='false'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName5' rs:number='5' rs:nullable='true'
   rs:writeunknown='true'>
  <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='1024'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName6' rs:number='6' rs:writeunknown='true'>
  <s:datatype dt:type='dateTime' rs:dbtype='timestamp'
   dt:maxLength='16' rs:scale='3' rs:precision='23' rs:fixedlength='true'
   rs:maybenull='false'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName7' rs:number='7' rs:nullable='true'
   rs:writeunknown='true'>
  <s:datatype dt:type='dateTime' rs:dbtype='timestamp'
   dt:maxLength='16' rs:scale='3' rs:precision='23' rs:fixedlength='true'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName8' rs:number='8'
   rs:nullable='true' rs:writeunknown='true'>
  <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='1024'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName9' rs:number='9'
   rs:writeunknown='true'>
  <s:datatype dt:type='boolean' dt:maxLength='2' rs:fixedlength='true'
   rs:maybenull='false'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName10' rs:number='10' rs:nullable='true'
   rs:writeunknown='true'>
  <s:datatype dt:type='int' dt:maxLength='4' rs:precision='10'
   rs:fixedlength='true'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName11' rs:number='11' rs:nullable='true'
   rs:writeunknown='true'>
  <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='8000'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName12' rs:number='12' rs:nullable='true'
   rs:writeunknown='true'>
  <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='8000'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName13' rs:number='13' rs:nullable='true'
   rs:writeunknown='true'>
  <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='255'/>
 </s:AttributeType>
 <s:extends type='rs:rowbase'/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row AtrName1='11' AtrName2='2' AtrName3='someword1'
  AtrName4='' AtrName6='2011-10-15T16:01:24.463000000'
  AtrName8='sometext1' AtrName9='False' AtrName11='veryveryveryveryryveryveryveryveryvery, and=again=, =veryveryvery=, andveryveryveryvery=, ==andveyveryvery, andendveryLongStringHelpMePLEASE'/>
</rs:data>
</xml>


sniknik   (2012-04-04 16:44:00) [1]

от подписи вида "Unicode" в значении поля, файл юникодным не станет.


D-Rulez   (2012-04-04 13:11:00) [2]

Пример XML:

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly'>
 <s:AttributeType name='AtrName1' rs:number='1' rs:writeunknown='true'>
  <s:datatype dt:type='int' dt:maxLength='4' rs:precision='10'
   rs:fixedlength='true' rs:maybenull='false'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName2' rs:number='2' rs:writeunknown='true'>
  <s:datatype dt:type='ui1' dt:maxLength='1' rs:precision='3'
   rs:fixedlength='true' rs:maybenull='false'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName3' rs:number='3' rs:nullable='true'
   rs:writeunknown='true'>
  <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='128'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName4' rs:number='4' rs:writeunknown='true'>
  <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='128'
   rs:maybenull='false'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName5' rs:number='5' rs:nullable='true'
   rs:writeunknown='true'>
  <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='1024'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName6' rs:number='6' rs:writeunknown='true'>
  <s:datatype dt:type='dateTime' rs:dbtype='timestamp'
   dt:maxLength='16' rs:scale='3' rs:precision='23' rs:fixedlength='true'
   rs:maybenull='false'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName7' rs:number='7' rs:nullable='true'
   rs:writeunknown='true'>
  <s:datatype dt:type='dateTime' rs:dbtype='timestamp'
   dt:maxLength='16' rs:scale='3' rs:precision='23' rs:fixedlength='true'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName8' rs:number='8'
   rs:nullable='true' rs:writeunknown='true'>
  <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='1024'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName9' rs:number='9'
   rs:writeunknown='true'>
  <s:datatype dt:type='boolean' dt:maxLength='2' rs:fixedlength='true'
   rs:maybenull='false'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName10' rs:number='10' rs:nullable='true'
   rs:writeunknown='true'>
  <s:datatype dt:type='int' dt:maxLength='4' rs:precision='10'
   rs:fixedlength='true'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName11' rs:number='11' rs:nullable='true'
   rs:writeunknown='true'>
  <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='8000'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName12' rs:number='12' rs:nullable='true'
   rs:writeunknown='true'>
  <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='8000'/>
 </s:AttributeType>
 <s:AttributeType name='AtrName13' rs:number='13' rs:nullable='true'
   rs:writeunknown='true'>
  <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='255'/>
 </s:AttributeType>
 <s:extends type='rs:rowbase'/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row AtrName1='11' AtrName2='2' AtrName3='someword1'
  AtrName4='' AtrName6='2011-10-15T16:01:24.463000000'
  AtrName8='русский текст не пройдет - Unicode' AtrName9='False' AtrName11='veryveryveryveryryveryveryveryveryvery, and=again=, =veryveryvery=, andveryveryveryvery=, ==andveyveryvery, andendveryLongStringHelpMePLEASE'/>
</rs:data>
</xml>


Вызов:
ADODataSet1.LoadFromFile(FileName);


D-Rulez   (2012-04-04 10:21:00) [3]

Delphi XE.
В настройках грида вставил RUSSIAN_CHARSET.
Но ошибка осталась.


sniknik   (2012-04-04 00:41:00) [4]

ЮНИКОД


D-Rulez   (2012-04-04 00:30:00) [5]

>какие таинства??? сам же писал строку кода с клиентским, замени на >адошниый... все.

Заменил. результат повторен:
An invalid character was found in text content.

Печалька.


sniknik   (2012-04-03 22:40:00) [6]

> Вы про xml header? Если да, то поверьте загловки совпадают.
пр схему, для русских полей делаются синонимы для отображения.

> Но посветите начинающего хотя бы самую малость в это таинство знаний?
какие таинства??? сам же писал строку кода с клиентским, замени на адошниый... все.


D-Rulez   (2012-04-03 22:34:00) [7]

>для русских названий заголовок формируется не так.
>да и сам он должен быть весь в юникоде.
Вы про xml header? Если да, то поверьте загловки совпадают.

>p.s. ну прямо таки титанических усилий стоит поменять один тип набора >данных на другой. без копипаста естественно.
Благодарен за вашу помощь, и уверен, что вы все знаете.

Но посветите начинающего хотя бы самую малость в это таинство знаний?
Вы же тоже когда-то начинали с чего-то свой путь...


sniknik   (2012-04-03 22:12:00) [8]

> не так.
да и сам он должен быть весь в юникоде.


sniknik   (2012-04-03 22:09:00) [9]

> Достаточно вставить в один из параметров любую русскую букву
для русских названий заголовок формируется не так.


sniknik   (2012-04-03 22:01:00) [10]

> Хорошо. Адошный.
одолжений не делай. не нужно? тогда брось это, нафига тебе это программирование?

> Код:
почему Query а не DataSet? ну вот серьезно почему у клиентского DataSet, а тут раз, и Query????????

> На приведенном хмл дает:
именно с приведенным все нормально.

p.s. ну прямо таки титанических усилий стоит поменять один тип набора данных на другой. без копипаста естественно.


D-Rulez   (2012-04-03 21:36:00) [11]

Достаточно вставить в один из параметров любую русскую букву


D-Rulez   (2012-04-03 21:35:00) [12]

Пример заработал, но

function RecordsetFromXML(const XML: string): _Recordset;
var
  RS: Variant;
  Stream: TStringStream;
begin
  Result := nil;
  if XML = '' then Exit;
  try
    Stream := TStringStream.Create(XML);
    Stream.Position := 0;
    RS := CreateOleObject('ADODB.Recordset');
    RS.Open(TStreamAdapter.Create(Stream) as IUnknown);
    Result := IUnknown(RS) as _Recordset;
  finally
    Stream.Free;
  end;
end;

Функция не отрабатывает русские символы в значениях параметров (((


D-Rulez   (2012-04-03 20:54:00) [13]

Так уже начинаю понимать. Что-то не то с символом где-то


D-Rulez   (2012-04-03 20:51:00) [14]

Хорошо. Адошный.

Код:
ADOQuery1.Recordset:=RecordsetFromXML(Memo1.Lines.Text);

На приведенном хмл дает:
An invalid character was found in text content.


sniknik   (2012-04-03 20:42:00) [15]

тебе же сказали, что это ADO-шный рекордсет, что непонятно? написать, что он <> клиентскому? или - "нажми F1"?


D-Rulez   (2012-04-03 20:35:00) [16]

Бросаем на форму XMLTransformProvider1
В Clientdataset1 задаем XMLTransformProvider1.

Но Transfomationfile must be specified. Его получить не удается из хмлмаппера.

Подскажите, что делаю не так?

Может, есть простое решение, а я о нем не знаю?


D-Rulez   (2012-04-03 20:29:00) [17]

Например, можно так

Clientdataset1.LoadFromFile('xo.xml');

ошибка - Mismatch in datapacket.


D-Rulez   (2012-04-03 20:25:00) [18]

из-за невоможности создать TransformRead


D-Rulez   (2012-04-03 20:15:00) [19]

преобразовать не дает маппер, как писал в сообщении выше. т.е. схема хмл трансформ - клинетдатасет- дбгрид не работает


D-Rulez   (2012-04-03 20:13:00) [20]

Вот и я подозреваю, что рекорд сет. А как прочитать?

В хмлтрансформ, и в клиентдатасет такой хмл не скормить. при активации ошибку выдаст. поля в клиент лата сет при этом указаны явно. но хмлтрнасформ не знает, как преобразовывать


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо