![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка очень интеренсого по формату XML, [D7, WinXP]
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]Вот и я подозреваю, что рекорд сет. А как прочитать?
В хмлтрансформ, и в клиентдатасет такой хмл не скормить. при активации ошибку выдаст. поля в клиент лата сет при этом указаны явно. но хмлтрнасформ не знает, как преобразовывать