Форум » [x]Harbour » Снова XML » Ответить

Снова XML

Dima: Нужно создавать / читать XML в UTF-16 Что есть в этом плане в Harbour ? Минимум нужно корректное чтение !

Ответов - 61, стр: 1 2 3 4 All

SergKis: Давно использую для чтения предложенное от А.Кресина. Пример: [pre2] FUNCTION Xml_Open( xml ) LOCAL a,c,h,f,i,j,k,n,o,t,oXml,cFil,e := "ERROR",cVal,cDop,cKd cVal := gIniC7(cFileIni, "COM", "Currency1", "EUR") cVal := upper(cVal) cDop := gIniC7(cFileIni, "COM", "Currency2", "LVL") cDop := upper(cDop) cKd := cVal+','+cDop IF empty(xml) MsgBox(Lower(e), "Empty parameters", e) RETURN .F. ENDIF IF ! file(xml) MsgBox(Lower(e), "Not found:"+xml, e) RETURN .F. ENDIF j := space(3) h := fOpen(xml) IF h > 0 j := space(3) fRead(h, @j, 3) fClose(h) ENDIF IF j == chr(239)+chr(187)+chr(191) c := cWrk+iif(right(cWrk, 1) == "\", "", "\") f := c+lower(ProcName())+".xml" h := fCreate(f) IF h > 0 a := FileToArray(xml) k := len(a) FOR i := 1 TO k j := a[ i ] IF i == 1 IF left(j, 3) == chr(239)+chr(187)+chr(191); j := subs(j, 4) ENDIF ENDIF fWrite(h, j+hb_OsNewLine()) NEXT fClose(h) ENDIF oXml := HXMLDoc():Read(f) ELSE oXml := HXMLDoc():Read(xml) ENDIF IF Empty( oXml ) MsgBox(Lower(e), "Not found:"+xml, e) RETURN .F. ENDIF IF Empty( oXml:aItems ) MsgBox(Lower(e), "Not found:"+xml, e) RETURN .F. ENDIF cFil := xml IF ( i := RAt("\", xml) ) > 0; cFil := subs(xml, i+1) ENDIF Init_Stru(cFil) IF ! IsOrder(oXml); RETURN .F. ENDIF IF ! GetOrder_Currency(cKd); RETURN .F. ENDIF IF ! GetOrder_Header(); RETURN .F. ENDIF GetDocument_Parties() GetOrder_Parties() GetOrder_Summary() IF ! Crt_OrderDbf(); RETURN .F. ENDIF IF ! empty(f); fErase(f) ENDIF RETURN .T. FUNCTION IsOrder( oXml ) LOCAL c,i,j,k,o,t,v,e := "ERROR" t := "Document-Order" oXmlDoc := oXml:find(t) IF Empty( oXmlDoc ) MSgBox(Lower(e), "Not found tag:<"+t+">", e) RETURN .F. ENDIF t := "Document-Header" o := oXmlDoc:find(t) IF Empty( o ) MsgBox(Lower(e), "Not found tag:<"+t+">", e) RETURN .F. ENDIF t := "DocumentType" j := o:find(t) IF valtype(j) != "O" MsgBox(Lower(e), "Not found tag:<"+t+">", e) RETURN .F. ENDIF v := j:aItems[1] IF valtype(v) != "C" MsgBox(Lower(e), "Not found tag:<"+t+">", e) RETURN .F. ENDIF IF v != "ORDER" MsgBox(Lower(e), "File xml not found value ORDER:<"+t+">", e) RETURN .F. ENDIF k := len(o:aItems) FOR i := 1 TO k j := o:aItems ArrOrderHead(j:title, Get_Value(j, 1)) NEXT RETURN .T. [/pre2]

SergKis: PS чуть поехало в конце[pre2] k := len(o:aItems) FOR i := 1 TO k j := o:aItems[ i ] ArrOrderHead(j:title, Get_Value(j, 1)) NEXT [/pre2] Пример xml:[pre2] <?xml version="1.0" encoding="Utf-8"?> <Document-Order> <Document-Header> <DocumentReceiveDateTime>2010-09-23T11:01:32</DocumentReceiveDateTime> <DocumentProcessDateTime>2010-09-23T11:03:09</DocumentProcessDateTime> <DocumentType>ORDER</DocumentType> <DocumentSource>F</DocumentSource> <OriginalFileName>![CDATA[ORDERS_51653730.xml]]</OriginalFileName></Document-Header> <Order-Header> <OrderNumber>4518964305</OrderNumber> <OrderDate>2010-09-23</OrderDate> <OrderCurrency>LVL</OrderCurrency> <ExpectedDeliveryDate>2010-09-24</ExpectedDeliveryDate> <DocumentFunctionCode>O</DocumentFunctionCode> </Order-Header> <Document-Parties> <Sender> <ILN>4751008570007</ILN> </Sender> <Receiver> <ILN>4750140000007</ILN> <CodeBySender>1082</CodeBySender> </Receiver> <Creator> <SystemUniqueCode>system</SystemUniqueCode> <Name>System user</Name> <CreationType>E</CreationType> </Creator> </Document-Parties> <Order-Parties> <Buyer> <ILN>4751008570007</ILN> <Name>Rimi Latvia SIA</Name> <OperatorDetails> <Name>Inga Mankevica</Name> <TelephoneNumber>+3713713920152, +3713719483712</TelephoneNumber> <E-mail>sn.bauska@rimibaltic.com</E-mail> </OperatorDetails> </Buyer> <Seller> <ILN>4750140000007</ILN> <Name>Bisoks SIA</Name> <CodeByBuyer>1082</CodeByBuyer> </Seller> <DeliveryPoint> <ILN>4751008571394</ILN> <Name>SuperNetto Bauska</Name> <CodeBySupplier>S20</CodeBySupplier> <CodeByBuyer>S120</CodeByBuyer> <StreetAndNumber>Za─╝─Б iela 3</StreetAndNumber> <CityName>Bauska</CityName> <Country>LV</Country> </DeliveryPoint> <ShipFrom> <CodeByBuyer>1082</CodeByBuyer> </ShipFrom> </Order-Parties> <Order-Lines> <Line> <Line-Item> <LineNumber>10</LineNumber> <EAN>4750140220719</EAN> <BuyerItemCode>746934</BuyerItemCode> <ItemDescription>SIEVIE┼аU PUSGAR─АS ZE─╢ES 22071</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>16.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>0.8000</OrderedUnitNetPrice> <OrderedNetAmount>12.8000</OrderedNetAmount> </Line-Item> </Line> <Line> <Line-Item> <LineNumber>20</LineNumber> <EAN>4750140411551</EAN> <BuyerItemCode>459632</BuyerItemCode> <SupplierItemCode>41155</SupplierItemCode> <ItemDescription>SIEV.ZE─╢B.41155 FAVORITE SPECIAL 20DEN</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>15.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>0.3600</OrderedUnitNetPrice> <OrderedNetAmount>5.4000</OrderedNetAmount> </Line-Item> </Line> <Line> <Line-Item> <LineNumber>30</LineNumber> <EAN>4750140411209</EAN> <BuyerItemCode>459638</BuyerItemCode> <SupplierItemCode>41120</SupplierItemCode> <ItemDescription>SIEV.ZE─╢B.41120 FAVORITE SLIM 20DEN KAST</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>30.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>0.2800</OrderedUnitNetPrice> <OrderedNetAmount>8.4000</OrderedNetAmount> </Line-Item> </Line> <Line> <Line-Item> <LineNumber>40</LineNumber> <EAN>4750140411407</EAN> <BuyerItemCode>459640</BuyerItemCode> <SupplierItemCode>41140</SupplierItemCode> <ItemDescription>SIEV.ZE─╢B.41140 FAVORITE COMF.30DEN KAST</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>24.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>0.3900</OrderedUnitNetPrice> <OrderedNetAmount>9.3600</OrderedNetAmount> </Line-Item> </Line> <Line> <Line-Item> <LineNumber>50</LineNumber> <EAN>4750140421260</EAN> <BuyerItemCode>459210</BuyerItemCode> <ItemDescription>SIEV.ZE─╢B. 42126 RELAX FAVORITE 40DEN</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>16.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>0.9600</OrderedUnitNetPrice> <OrderedNetAmount>15.3600</OrderedNetAmount> </Line-Item> </Line> <Line> <Line-Item> <LineNumber>60</LineNumber> <EAN>4750140721025</EAN> <BuyerItemCode>458908</BuyerItemCode> <ItemDescription>SIEVIE┼аU BIKS─кTES 72102 BISOKS</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>9.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>1.3200</OrderedUnitNetPrice> <OrderedNetAmount>11.8800</OrderedNetAmount> </Line-Item> </Line> <Line> <Line-Item> <LineNumber>70</LineNumber> <EAN>4750140221389</EAN> <BuyerItemCode>746932</BuyerItemCode> <ItemDescription>SIEVIE┼аU VILNAS ─кSZE─╢ES 22138</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>20.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>0.5800</OrderedUnitNetPrice> <OrderedNetAmount>11.6000</OrderedNetAmount> </Line-Item> </Line> <Line> <Line-Item> <LineNumber>80</LineNumber> <EAN>4750140220573</EAN> <BuyerItemCode>464983</BuyerItemCode> <ItemDescription>SIEVIE┼аU ZE─╢ES 22057 FAVORITE FITNESS</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>30.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>0.6100</OrderedUnitNetPrice> <OrderedNetAmount>18.3000</OrderedNetAmount> </Line-Item> </Line> <Line> <Line-Item> <LineNumber>90</LineNumber> <EAN>4750140252512</EAN> <BuyerItemCode>462296</BuyerItemCode> <SupplierItemCode>25251</SupplierItemCode> <ItemDescription>SIEV.PUSG.ZE─╢ES 3 P─АRI 25251 FAV.20DEN</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>25.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>0.3700</OrderedUnitNetPrice> <OrderedNetAmount>9.2500</OrderedNetAmount> </Line-Item> </Line> <Line> <Line-Item> <LineNumber>100</LineNumber> <EAN>4750140252116</EAN> <BuyerItemCode>462295</BuyerItemCode> <SupplierItemCode>25211</SupplierItemCode> <ItemDescription>SIEV. ─кS─АS ZE─╢ES 20 DEN 3 P─АRI 25211 FAV</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>45.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>0.3000</OrderedUnitNetPrice> <OrderedNetAmount>13.5000</OrderedNetAmount> </Line-Item> </Line> <Line> <Line-Item> <LineNumber>110</LineNumber> <EAN>4750140421116</EAN> <BuyerItemCode>516964</BuyerItemCode> <SupplierItemCode>42111</SupplierItemCode> <ItemDescription>SIEV.ZE─╢B.42111 FAVORITE MAKE UP 20DEN</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>5.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>0.5800</OrderedUnitNetPrice> <OrderedNetAmount>2.9000</OrderedNetAmount> </Line-Item> </Line> <Line> <Line-Item> <LineNumber>120</LineNumber> <EAN>4750140511084</EAN> <BuyerItemCode>792581</BuyerItemCode> <SupplierItemCode>51108</SupplierItemCode> <ItemDescription>MEIT.POLIAM.ZE─╢B.51108 FAVORITE</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>20.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>1.0300</OrderedUnitNetPrice> <OrderedNetAmount>20.6000</OrderedNetAmount> </Line-Item> </Line> <Line> <Line-Item> <LineNumber>130</LineNumber> <EAN>4750140320587</EAN> <BuyerItemCode>446173</BuyerItemCode> <SupplierItemCode>32058</SupplierItemCode> <ItemDescription>B─ТRNU ZE─╢ES 32058 BISOKS</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>34.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>0.6100</OrderedUnitNetPrice> <OrderedNetAmount>20.7400</OrderedNetAmount> </Line-Item> </Line> <Line> <Line-Item> <LineNumber>140</LineNumber> <EAN>4750140221372</EAN> <BuyerItemCode>747087</BuyerItemCode> <SupplierItemCode>22137</SupplierItemCode> <ItemDescription>SIEVIE┼аU VILNAS ZE─╢ES FAVORITE 22137</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>22.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>0.6100</OrderedUnitNetPrice> <OrderedNetAmount>13.4200</OrderedNetAmount> </Line-Item> </Line> <Line> <Line-Item> <LineNumber>150</LineNumber> <EAN>4750140421390</EAN> <BuyerItemCode>771258</BuyerItemCode> <SupplierItemCode>42139</SupplierItemCode> <ItemDescription>S.Z/B.FAVORITE MICRO*SOFT 60 DEN 42139</ItemDescription> <ItemType>CU</ItemType> <OrderedQuantity>25.000</OrderedQuantity> <OrderedUnitPacksize>1.000</OrderedUnitPacksize> <UnitOfMeasure>GAB</UnitOfMeasure> <OrderedUnitNetPrice>1.2400</OrderedUnitNetPrice> <OrderedNetAmount>31.0000</OrderedNetAmount> </Line-Item> </Line> </Order-Lines> <Order-Summary> <TotalLines>15</TotalLines> <TotalOrderedAmount>336.000</TotalOrderedAmount> <TotalNetAmount>204.5100</TotalNetAmount> </Order-Summary> </Document-Order> [/pre2]

Dima: Ты про эту ? [pre2] /* * $Id: hxmldoc.prg 2265 2014-06-11 08:54:33Z alkresin $ * * Harbour XML Library * HXmlDoc class * * Copyright 2003 Alexander S.Kresin <alex@kresin.ru> * www - http://www.kresin.ru */ [/pre2] та что на сайте у него в сырцах HWGUI ? А что насчет UTF-16 ?


SergKis: Dima пишет та что на сайте у него в сырцах HWGUI ? А что насчет UTF-16 ? Брали оттуда для hb 2.0, так и работаем. Вроде в hb 3.2 похожий, а может и тот же - не смотрел. С Utf8 просто: 1. если файл xml с BOM, то откусываем BOM IF left(j, 3) == chr(239)+chr(187)+chr(191); j := subs(j, 4) ENDIF 3. Получаею значения [pre2] ... k := len(o:aItems) FOR i := 1 TO k j := o:aItems[ i ] ArrOrderHead(j:title, Get_Value(j, 1)) NEXT ... FUNCTION Get_Value( o, n, lUtf8 ) LOCAL j Default lUtf8 := m->lUtf8Set IF n == NIL; n := 1 ENDIF j := o:aItems[ n ] IF valtype(j) == "C" If lUtf8; j := hb_Utf8ToStr(j) EndIf ELSE ; j := "" ENDIF RETURN j [/pre2] Формирую xml как правило так: [pre2] <?xml version="1.0" encoding="Utf-8"?> <Document-Invoice> <Document-Header> <DocumentReceiveDateTime>^mDtoS(Date(), "-")+"T"+Time()</DocumentReceiveDateTime> <DocumentProcessDateTime>^-</DocumentProcessDateTime> <DocumentID>^-</DocumentID> <DocumentUID>^-</DocumentUID> <DocumentType>INVOICE</DocumentType> <DocumentSource>W</DocumentSource> <OriginalFileName>^-</OriginalFileName> </Document-Header> <Invoice-Header> <InvoiceNumber>^AllTrim(NR_2)+AllTrim(NR_1)</InvoiceNumber> <InvoiceDate>^mDtoS(Date(), "-")</InvoiceDate> <InvoiceCurrency>^OH_3</InvoiceCurrency> <InvoicePaymentDueDate>^mDtoS(Date()+10, "-")</InvoicePaymentDueDate> <InvoicePaymentTerms>10</InvoicePaymentTerms> <InvoicePostDate>^-</InvoicePostDate> <DocumentFunctionCode>O</DocumentFunctionCode> <DocumentNameCode>380</DocumentNameCode> <Remarks>^GetFile("txt_remarks.txt",.T.)</Remarks> <Order> <BuyerOrderNumber>^OH_1</BuyerOrderNumber> <BuyerOrderDate>^OH_2</BuyerOrderDate> <SellerOrderNumber>^-</SellerOrderNumber> </Order> <Delivery> <DeliveryLocationNumber>^OP_9</DeliveryLocationNumber> <CodeBySeller>^-</CodeBySeller> <CodeByBuyer>^-</CodeByBuyer> <Name>^-</Name> <StreetAndNumber>^-</StreetAndNumber> <CityName>^-</CityName> <Country>^-</Country> <DeliveryDate>^mDtoS(Date(), "-")</DeliveryDate> <DespatchNumber>^AllTrim(NR_2)+AllTrim(NR_1)</DespatchNumber> </Delivery> </Invoice-Header> <Document-Parties> <Sender> <ILN>^OP_6</ILN> </Sender> <Receiver> <ILN>^OP_1</ILN> </Receiver> <Creator> <SystemUniqueCode>^-</SystemUniqueCode> <Name>^-</Name> <E-mail>^-</E-mail> <CreationType>^-</CreationType> </Creator> </Document-Parties> <Invoice-Parties> <Buyer> <ILN>^OP_1</ILN> <TaxID>^-</TaxID> <CodeBySeller>^-</CodeBySeller> <UtilizationRegisterNumber>^-</UtilizationRegisterNumber> <Name>^-</Name> <StreetAndNumber>^gT("StreetR")</StreetAndNumber> <CityName>^-</CityName> <PostalCode>^-</PostalCode> <Country>^-</Country> </Buyer> <Payer> <ILN>^OP_1</ILN> <TaxID>^-</TaxID> <CodeBySeller>^-</CodeBySeller> <CodeByBuyer>^-</CodeByBuyer> <UtilizationRegisterNumber>^-</UtilizationRegisterNumber> <Name>^-</Name> <StreetAndNumber>^gT("StreetR")</StreetAndNumber> <CityName>^-</CityName> <PostalCode>^-</PostalCode> <Country>^-</Country> </Payer> <Invoicee> <ILN>^OP_1</ILN> <TaxID>^-</TaxID> <CodeBySeller>^-</CodeBySeller> <CodeByBuyer>^-</CodeByBuyer> <UtilizationRegisterNumber>^-</UtilizationRegisterNumber> <Name>^-</Name> <StreetAndNumber>^gT("StreetR")</StreetAndNumber> <CityName>^-</CityName> <PostalCode>^-</PostalCode> <Country>^-</Country> </Invoicee> <Seller> <ILN>^OP_6</ILN> <TaxID>^-</TaxID> <CodeBySeller>^-</CodeBySeller> <CodeByBuyer>^-</CodeByBuyer> <UtilizationRegisterNumber>^-</UtilizationRegisterNumber> <Name>^-</Name> <StreetAndNumber>^gT("StreetB")</StreetAndNumber> <CityName>^-</CityName> <PostalCode>^-</PostalCode> <Country>^-</Country> <OperatorDetails> <Name>^-</Name> <TelephoneNumber>^-</TelephoneNumber> <E-mail>^-</E-mail> </OperatorDetails> </Seller> <Payee> <ILN>^OP_6</ILN> <TaxID>^-</TaxID> <AccountNumber>^-</AccountNumber> <UtilizationRegisterNumber>^-</UtilizationRegisterNumber> <CodeBySeller>^-</CodeBySeller> <CodeByBuyer>^-</CodeByBuyer> <Name>^-</Name> <StreetAndNumber>^gT("StreetB")</StreetAndNumber> <CityName>^-</CityName> <Country>^-</Country> </Payee> </Invoice-Parties> <Invoice-Lines> <Line> <Line-Item> <LineNumber>^u2s(LN_1)</LineNumber> <EAN>^AllTrim(LN_2)</EAN> <SupplierItemCode>^-</SupplierItemCode> <ItemDescription>^LN_13</ItemDescription> <InvoiceQuantity>^iif(empty(LN_14), LN_7, LN_14)</InvoiceQuantity> <InvoiceUnitNetPrice>^iif(empty(LN_15), LN_10, LN_15)</InvoiceUnitNetPrice> <UnitOfMeasure>^LN_24</UnitOfMeasure> <InvoicedUnitPackSize>^-</InvoicedUnitPackSize> <TaxRate>^LN_22</TaxRate> <TaxCategoryCode>S</TaxCategoryCode> <TaxAmount>^LN_23</TaxAmount> <NetAmount>^iif(empty(LN_16), LN_11, LN_16)</NetAmount> </Line-Item> <Line-Delivery> <DeliveryLocationNumber>^OP_9</DeliveryLocationNumber> <CodeByBuyer>^-</CodeByBuyer> <Name>^-</Name> <DeliveryDate>^mDtoS(Date()+10, "-")</DeliveryDate> <DespatchNumber>^AllTrim(NR_2)+AllTrim(NR_1)</DespatchNumber> </Line-Delivery> <Line-AdditionalInformation> <CountryOfOrigin>^-</CountryOfOrigin> </Line-AdditionalInformation> </Line> </Invoice-Lines> <Invoice-Summary> <TotalLines>^OS_7</TotalLines> <TotalNetAmount>^OS_6</TotalNetAmount> <TotalTaxAmount>^OS_4</TotalTaxAmount> <TotalRounding>^-</TotalRounding> <TotalGrossAmount>^OS_6+OS_4</TotalGrossAmount> <Tax-Summary> <Tax-Summary-Line> <TaxRate>^OS_5</TaxRate> <TaxCategoryCode>S</TaxCategoryCode> <TaxAmount>^OS_4</TaxAmount> <TaxableAmount>^OS_6</TaxableAmount> </Tax-Summary-Line> </Tax-Summary> </Invoice-Summary> </Document-Invoice>[/pre2] где ^... - типа макроса для получения данных в тэг (<TotalGrossAmount>^OS_6+OS_4</TotalGrossAmount>) а ^- ( <TotalRounding>^-</TotalRounding> ) - тэг может отсутсвовать или быть пустым

SergKis: PS тексты языковые так <StreetAndNumber>^gT("StreetR")</StreetAndNumber> - рус. текст <StreetAndNumber>^gT("StreetL")</StreetAndNumber> - лат. текст внутри gt(...) If lUtf8; cTxt := hb_Str2Utf8(cT) cdp установлена должна быть правильной для работы hb_StrToUtf8, hb_Utf8Str

SergKis: PS 2 для ясности, читаю этот шаблон теми же средсвами, подставляю мкросы и вывожу в new.xml секции xml цикловые <Line> <Line-Item> ... </Line-Item> ... </Line> кручу в цикле DO WHILE ! EOF() ... заполняя данными макросов и подавая строки на выход

Dima: Сергей я в стопитсотый раз спрашиваю а как быть с UTF-16 а ты все молчишь Или я чего пропустил ?

SergKis: Dima Мне странно, что файл xml в unicode, даже не встречал в реале. В Dos у нас была утилитка перезаписи unicode -> Lv866 Возми в редактор ( можно notepad.exe, notepad2.exe) и перекодируй в Utf8, возможно где то есть готовые утилитки

Dima: Это должен быть автомат. Вот чего пишут в протоколе обмена [pre2] • Структура файла обмена данными Файл обмена данными представляет собой ZIP-архив, который может быть защищен паролем. Загружаемый в МУ архив с данными имеет название "From1C.zip" и внутри архива могут находиться следующие файлы: • XML-файл описания данных "FromCDB.xml". Формат XML-файла описывается в разделах ниже. При выгрузке данных из МУ формируется архив с названием "To1C.zip" и внутри архива могут находиться следующие файлы: • XML-файл описания данных "ToCDB.xml". Формат XML-файла описывается в разделах ниже. • Формат XML-файлов обмена данными Первая строка XML-файла называется объявлением XML – это строка, указывающая версию XML. Также здесь должна быть указана кодировка символов. Файл выгрузки из МУ имеет кодировку "UTF-16", файл загрузки в МУ из ЦБД может иметь кодировки "UTF-8", "UTF-16". Далее следует корневой тэг DATA. Атрибуты тэга описаны в таблице ниже. [/pre2] Файл выгрузки идет из проги под Андроид

SergKis: Dima в hb 3.2 есть src\codepage\cp_u16le.c static HB_CDP_GET_FUNC( UTF16LE_get ) ... так что думаю есть и установка cdp для нее, ставь, читай файл и делай hb_StrToUtf8

SergKis: Dima пишетФайл выгрузки идет из проги под Андроид Ну да с телефона xml я еще не принимал

Pasha: Как вариант: перекодировать файл в utf-8, работать с ним, а результат перекодировать в utf-16. С xml в utf-8 я успешно работаю как раз с помощью библиотеки А.Кресина. Непосредственно с utf-16 она конечно будет работать некорректно.

SergKis: Dima пишет Первая строка XML-файла называется объявлением XML – это строка, указывающая версию XML. Также здесь должна быть указана кодировка символов у меня <?xml version="1.0" encoding="Utf-8"?> а у тебя ?

Dima: SergKis [pre2] Пример: <?xml version="1.0" encoding="utf-16"?> <DATA> <CONSTANTS> ... </CONSTANTS> </DATA> [/pre2]

SergKis: Dima тогда по Пашиному рецепту перекодировать файл в utf-8, работать с ним, а результат перекодировать в utf-16. если принимаешь данные, то достаточно "перекодировать файл в utf-8" и отработать, например как у меня на библиоте А.Кресина если надо отдавать, то формируешь вых. xml в Utf8 (любым способом) и потом "результат перекодировать в utf-16"

Dima: Всем спасибо , нужно переварить это дело. Доки на родном языке я так понял нет к библиотеке А.Кресина.

Dima: Не пойму что ей надо :) [pre2] #include "hxml.ch" Proc main local oXml,oXmlDoc REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") REQUEST HB_CODEPAGE_UTF16LE REQUEST HB_CODEPAGE_UTF8 REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) oXml := HXMLDoc():Read( "test.xml" ) oXmlDoc := oXml:find("CONSTANTS") ? empty( oXmlDoc ) // .T. wait return nil [/pre2] Не находит CONSTANTS <?xml version="1.0" encoding="UTF-8"?> <DATA KILLALL="1"> <CONSTANTS> <ELEMENTS> <ITEM GUID="0270B3D5-4213-419B-9E3A-48CBA4CAEC04" Value="1"/> <ITEM GUID="619D132F-4A21-4DB6-99CB-240F254E218D" Value="1"/> <ITEM GUID="61A474B1-21D0-4047-B2D5-7213A7294050" Value=""/> <ITEM GUID="485EDECC-E0A9-4E1A-9091-7C71D8E6FF08" Value="66F150BD-9F28-4C85-A9C0-F2BA4D67CDF8"/> <ITEM GUID="D902C64A-9A7A-40D1-8067-E4BB6B309534" Value="1"/> <ITEM GUID="79C698DB-3C55-465E-ACFE-4741ACDD5655" Value="14ed8ba6-55bd-11d9-848a-00112f43529a"/> <ITEM GUID="A2E1CC68-0624-45A6-8057-EFD35259B9FE" Value="Белкина А."/> </ELEMENTS> <KILLEDS> </KILLEDS> </CONSTANTS> <DOCUMENTS> <DOCUMENT GUID="E01E1F5C-D6E4-46E8-B923-3758B0D79BDE" Comment="Заказы" > <ELEMENTS> <ITEM GUID="E9752AD9-17DB-489F-E40F-B0B72D211628" dt="2011-05-26T17:58:02" IsDeleted="0" IsPost="0" DocNumber="ТДАБ0002" A01="6894BE95-972E-4BDB-B7D3-84D7F378EA2F" A02="BD72D900-55BC-11D9-848A-00112F43529A" A06="0.00" A08="0.00" A09="0.000" A010="2011-05-26T11:34:55" A011=""/> <ITEM GUID="F28210DD-F7DB-4428-A5A6-BFDD69F71978" dt="2011-06-03T14:43:28" IsDeleted="0" IsPost="1" DocNumber="ТДАБ0003" A01="6894BE95-972E-4BDB-B7D3-84D7F378EA2F" A02="BD72D900-55BC-11D9-848A-00112F43529A" A03="CBCF494B-55BC-11D9-848A-00112F43529A" A04="5669DC72-64A6-11DF-B11F-001921430A4C" A05="CBCF494C-55BC-11D9-848A-00112F43529A" A06="3.00" A07="CBCF495D-55BC-11D9-848A-00112F43529A" A08="6057.83" A09="0.000" A010="2011-06-03T14:42:42" A011=""> <TABLES> <TABLE GUID="0738E61B-F06F-464A-8483-4249E0254819"> <ITEM GUID="F28210FA-97DB-4107-3E9A-2CB4259E199F" DocId="F28210DD-F7DB-4428-A5A6-BFDD69F71978" A01="DEE6E19A-55BC-11D9-848A-00112F43529A" A03="DEE6E19B-55BC-11D9-848A-00112F43529A" A04="1.000" A05="0.00" A09="3.00" A06="6057.83" A010="0" A07="6057.83" A08="0.000" A011="BD72D91F-55BC-11D9-848A-00112F43529A"/> </TABLE> </TABLES> </ITEM> </ELEMENTS> <KILLEDS> <ITEM GUID="E7D14BAA-47DB-4466-AAF3-D9A2317ACA5B"/> <ITEM GUID="E7D14A1B-67DB-4261-D1E1-BF539C773312"/> </KILLEDS> </DOCUMENT> </DOCUMENTS> <CATALOGS Comment="Справочники"> <CATALOG GUID="0E3CBAEA-5467-45CD-8C86-FB1777DA435B" Comment="Организации"> <ELEMENTS> <ITEM GUID="BD72D900-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="Торговый дом &quot;Комплексный&quot; " A02="0" A05="7705260699" A06="770501001" A07="" A04="(095) 1123456, доб. 789" A03="117452, Москва г, Симферопольский б-р, дом № 78, корпус 1" A09="112435, Москва, Одесская улица, дом № 67, корпус 1, кв.78" A010="ТД"/> <ITEM GUID="EF8F948C-8403-11DA-9AE9-000D884F5D77" IsDeleted="0" Name="Cтройснаб" A02="1" A05="7723240668" A06="772301001" A07="" A04="" A03="" A09="" A010="ССН"/> </ELEMENTS> </CATALOG> <CATALOG GUID="9450980F-FB59-47E3-BAE2-AA3C58441B1A" Comment="Контрагенты" KILLALL="1"> <GROUPS> <GROUP GUID="1E18C8DB-08F6-47DA-874B-100D6E109AB8" Comment="Группы"> <ELEMENTS> <ITEM GUID="CBCF494A-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="ПОКУПАТЕЛИ" ParId=""/> </ELEMENTS> </GROUP> </GROUPS> <ELEMENTS Comment="Элементы справочника 'Контрагенты'"> <ITEM GUID="DEE6E1B8-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="Инвема" A02="CBCF494A-55BC-11D9-848A-00112F43529A" A05="3" A06="D54381E3-D965-11DC-B30B-0018F30B88B5" A08="DEE6E1B9-55BC-11D9-848A-00112F43529A" A09="CBCF495D-55BC-11D9-848A-00112F43529A" GrpId0="CBCF494A-55BC-11D9-848A-00112F43529A"/> <ITEM GUID="DEE6E1C1-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="Саймон и Шустер" A02="CBCF494A-55BC-11D9-848A-00112F43529A" A05="3" A06="5BB4A903-C29F-11DC-96A3-0018F30B88B5" A08="DEE6E1C2-55BC-11D9-848A-00112F43529A" GrpId0="CBCF494A-55BC-11D9-848A-00112F43529A"/> </ELEMENTS> </CATALOG> <CATALOG GUID="D6D52ADA-0F38-4112-AF3C-2F1E425A43D1" Comment="Номенклатура" KILLALL="1"> <GROUPS> <GROUP GUID="8E502A85-8DD4-41CF-A7A4-17AB50872D36" Comment="Группы"> <ELEMENTS> <ITEM GUID="BD72D924-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="Бытовая техника" ParId=""/> <ITEM GUID="BD72D925-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="Кухонные электроприборы" ParId="BD72D924-55BC-11D9-848A-00112F43529A"/> </ELEMENTS> </GROUP> <GROUP GUID="E42DA5B9-E29B-43E1-B7E3-9B500879D6B7" Comment="Категории"> <ELEMENTS> <ITEM GUID="A8EBEACD-5818-11D9-A2C3-00055D80A2D1" IsDeleted="0" ParId="" Name="Кофеварки"/> <ITEM GUID="F3F718B5-0504-11DC-A415-00055D80A2D1" IsDeleted="0" ParId="" Name="Мясорубки"/> </ELEMENTS> </GROUP> </GROUPS> <ELEMENTS Comment="Элементы справочника 'Номенклатура'"> <ITEM GUID="BD72D927-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="Комбайн кухонный BINATONE FP 67" Code="00000000057" A04="18" A06="BD72D928-55BC-11D9-848A-00112F43529A" A08="0" A011="109" A013="BD72D928-55BC-11D9-848A-00112F43529A" A014="0" A015="0" A035="Комбайн кухонный BINATONE FP 67" A037="1" A038="0" A020="15956.19" A021="19932" A022="3730" A030="2" A031="107" A032="0" A033="0" A034="0" GrpId0="BD72D925-55BC-11D9-848A-00112F43529A" GrpId1="A8EBEACD-5818-11D9-A2C3-00055D80A2D1"/> <ITEM GUID="BD72D92C-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="Кофеварка BRAUN KF22R" Code="00000000102" A04="18" A06="BD72D92D-55BC-11D9-848A-00112F43529A" A08="0" A011="91" A013="BD72D92D-55BC-11D9-848A-00112F43529A" A014="0" A015="0" A035="Кофеварка BRAUN KF22R" A037="1" A038="0" A020="15956.19" A021="19932" A022="13925" A030="0" A031="91" A032="0" A033="0" A034="0" GrpId0="BD72D925-55BC-11D9-848A-00112F43529A" GrpId1="A8EBEACD-5818-11D9-A2C3-00055D80A2D1"/> <ITEM GUID="CBCF4999-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="Мясорубка ЭКМ-3" Code="00000000105" A04="18" A06="DEE6E169-55BC-11D9-848A-00112F43529A" A08="0" A011="1" A013="DEE6E169-55BC-11D9-848A-00112F43529A" A014="0" A015="0" A035="Мясорубка ЭКМ-3" A037="1" A038="0" A020="19090.44" A021="23847" A022="16661" A030="1" A031="0" A032="0" A033="0" A034="0" GrpId0="BD72D925-55BC-11D9-848A-00112F43529A" GrpId1="F3F718B5-0504-11DC-A415-00055D80A2D1"/> </ELEMENTS> </CATALOG> <CATALOG GUID="80452C60-B442-4DA9-A048-42F63270CA14" Comment="ЕдиницыИзмерения" KILLALL="1"> <ELEMENTS> <ITEM GUID="BD72D928-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="шт" A03="BD72D927-55BC-11D9-848A-00112F43529A" A02="1" A04="0"/> <ITEM GUID="BD72D92D-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="шт" A03="BD72D92C-55BC-11D9-848A-00112F43529A" A02="1" A04="0"/> <ITEM GUID="DEE6E169-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="10 упак" A03="CBCF4999-55BC-11D9-848A-00112F43529A" A02="1" A04="0"/> </ELEMENTS> </CATALOG> <CATALOG GUID="2516FFCE-F46F-4326-BE00-438EF0871D30" Comment="Склады" KILLALL="1"> <ELEMENTS> <ITEM GUID="BD72D91F-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="Главный склад" Code="0"/> <ITEM GUID="CBCF4956-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="Склад электротоваров" Code="1"/> <ITEM GUID="1DE4815D-FD36-11DB-A40E-00055D80A2D1" IsDeleted="0" Name="Автомобиль №1" Code="2"/> </ELEMENTS> </CATALOG> </CATALOGS> <NUMERATORS> <ELEMENTS> <ITEM GUID="EC0B3301-37DB-4900-B721-18CF64095C02" NumeratorId="3AFF1BBD-AF9A-415D-B6DD-1339C45C2F89" TypeId="6F823595-E28D-4DD7-8038-9B9BB2E04CEA" Prefix="ТД" Number="000000106"/> </ELEMENTS> </NUMERATORS> <PICTURES KILLALL="1"> <ELEMENTS> <ITEM GUID="133FEC77-97DB-434E-8DBA-77A6С3326C86" FileName="133FEC77-97DB-434E-8DBA-77A6С3326C86.png" Description="..." /> </ELEMENTS> </PICTURES> </DATA>

PSP: Dima, насколько я понимаю, в этом xml нет корневого элемента, обрамляющего все остальные элементы.

Dima: PSP Тэг DATA корневой

PSP: Хотя да, не разглядел)

PSP: Щас посмотрел на метод find(). По-моему, что-то там не так с логикой сканирования массива ::aItems. При первом же несовпадении цикл завершается и никакого find не получается) Или я не туда смотрю?))

SergKis: PSP пишет По-моему, что-то там не так с логикой сканирования массива ::aItems. там все норма. Надо сначала получать "DATA" в него вложены другие тэги, т.е. o := oXml:Find("DATA", 1) o := o:Find("CONSTANTS", 1) ... т.е. For i := 1 To len(oXml:aItems) o := oXml:aItems[ i ] ? o:ClassName, o:title Next o := oXml:Find("DATA", 1) For i := 1 To len(o) o2 := o:aItems[ i ] ? o2:ClassName, o2:title Next

SergKis: PS так надо For i := 1 To len(o:aItems)

PSP: SergKis пишет: Надо сначала получать "DATA" в него вложены другие тэги Ну да, как-то так...))

Dima: SergKis Да заработало , спасибо Но дальше у меня снова затык [pre2] oXml := HXMLDoc():Read( hb_DirBase()+"test.xml" ) o:=oXml:find("DATA",1) o:=o:find("CONSTANTS",1) o:=o:find("ELEMENTS") For i := 1 To len(o:aitems) j := o:aItems[ i ] ? j:ClassName, j:title // HXMLNODE ITEM Next [/pre2] Хотелось бы считать значения GUID и Value из всех полученных семи ITEM. Как ? И еще вопрос , слышал что XML не любит какие то символы. Какие и на что их менять ?

PSP: Dima пишет: Хотелось бы считать значения GUID и Value из всех полученных семи ITEM. Как ? Они находятся в массиве aAttr, т.е. в примере это будет o:aAttr

Dima: Да я уже понял , опередил. Я так понимаю это не HASH массив и поэтому юзать надо цифры и что типа такого не прокатит j:aattr["GUID"]

PSP: Да, обычный массив

Dima: PSP пишет: Да, обычный массив Печаль , с HASH было бы веселее.

SergKis: Dima ишет поэтому юзать надо цифры чем не устраивает [pre2] METHOD GetAttribute( cName, cType, xDefault ) CLASS HXMLNode Local i := Ascan( ::aAttr,{|a|a[1]==cName} ) IF i != 0 IF cType == Nil .OR. cType == "C" Return ::aAttr[ i,2 ] ELSEIF cType == "N" Return Val( ::aAttr[ i,2 ] ) ELSEIF cType == "L" Return ( Lower( ::aAttr[ i,2 ] ) $ ".t.;on;yes;true" ) ENDIF ENDIF Return xDefault [/pre2] ?

Dima: SergKis пишет: чем не устраивает Да устраивает Не подумал сразу об этом методе............жара..

Dima: Что то меня запарило писать o:=oXml:find("DATA") // тут делать проверки o:=o:find("CONSTANTS") // тут делать проверки o:=o:find("ELEMENTS") // тут делать проверки Накидал SeekXML (если уже что то есть в этом плане , ткните носом ) [pre2] Func SeekXML(oXml,aTitle,apos) local o ,j:=0 if apos==NIL apos:=Array( len(aTitle) ) apos:=Afill(apos,1) endif do while j < len(aTitle) ++j if j==1 o:=oXml:find( aTitle[ 1 ],apos[ 1 ]) if empty(o) return nil endif else o:=o:find( aTitle[ j ],apos[ j ]) if empty(o) return nil endif endif enddo return o [/pre2] Пример вызова OX:=SeekXML(oXml,{"DATA","CONSTANTS","ELEMENTS"}) а далее потрошим объект OX на атрибуты , предварительно проверив что OX не NIL

SergKis: Dima Цель обработки xml ?

Dima: SergKis пишет: Цель обработки xml ? Выбрать нужные данные и затем сложить их в общую базу. По ходу не понял как верно преобразовать XML из UTF-16 в UTF-8 Пробовал так HB_STRTOUTF8( WIN_WIDETOANSI(hb_MemoRead(hb_DirBase()+"test16.xml")) ,"RU1251") Все как бы нормально , но в самом конце добавилось целая куча вопросиков , примерно 7 тыщ штук ))

SergKis: Dima пишет Выбрать нужные данные и затем сложить их в общую базу. через рабочий файл или сразу в базу ? Пример вызова OX:=SeekXML(oXml,{"DATA","CONSTANTS","ELEMENTS"}) какой запрос будет здесь [pre2] <DOCUMENTS> <DOCUMENT GUID="E01E1F5C-D6E4-46E8-B923-3758B0D79BDE" Comment="Заказы" > <ELEMENTS> <ITEM GUID="E9752AD9-17DB-489F-E40F-B0B72D211628" dt="2011-05-26T17:58:02" IsDeleted="0" IsPost="0" DocNumber="ТДАБ0002" A01="6894BE95-972E-4BDB-B7D3-84D7F378EA2F" A02="BD72D900-55BC-11D9-848A-00112F43529A" A06="0.00" A08="0.00" A09="0.000" A010="2011-05-26T11:34:55" A011=""/> <ITEM GUID="F28210DD-F7DB-4428-A5A6-BFDD69F71978" dt="2011-06-03T14:43:28" IsDeleted="0" IsPost="1" DocNumber="ТДАБ0003" A01="6894BE95-972E-4BDB-B7D3-84D7F378EA2F" A02="BD72D900-55BC-11D9-848A-00112F43529A" A03="CBCF494B-55BC-11D9-848A-00112F43529A" A04="5669DC72-64A6-11DF-B11F-001921430A4C" A05="CBCF494C-55BC-11D9-848A-00112F43529A" A06="3.00" A07="CBCF495D-55BC-11D9-848A-00112F43529A" A08="6057.83" A09="0.000" A010="2011-06-03T14:42:42" A011=""> <TABLES> ... [/pre2]

Dima: SergKis пишет: через рабочий файл или сразу в базу ? собираю во временном а затем в базу SergKis пишет: какой запрос будет здесь Дорабатывать надо SeekXML А что насчет UTF16 в UTF8 что бы без косяков ?

SergKis: Dima пишет А что насчет UTF16 в UTF8 что бы без косяков ? думал так 1. сетавим cdp utf16 s := hb_memowrit("test.xml") hb_memowrit("tutf8.xml", hb_StrToUtf8(s)) 2. сетавим cdp ru1251 читаем "tutf8.xml" в oXml и работаем, там где читаем данные символьные делаем hb_Utf8ToStr(), как показывал в функции Get_Value(...) Dima пишет собираю во временном а затем в базу Дорабатывать надо SeekXML т.е. 1. надо тегам, атрибутам поставить в соотв. файл, структуру 2. завести обработчики для записи из xml в соотв. файл, поле (возможно с valid-ом, range) получ. данных может пойти др. путем (тут hash подйдет) 1. поставить соотв. тег, атрибут - структуре поля 2. поставить соотв. тег, атрибут блоку кода, передавая ьуда объект тега 3. тогда просто обходим все обекты - создаем временные, открываем dbf с алиасом тега например 4. повторный обход для выполнения блоков кода по переносу в dbf данных блоками кода, передавая туда объкт с атрибутами

Dima: SergKis пишет: думал так Это не работает. Только ты ошибся . У меня на входе XML в кодировке UTF-16 (utf-16 little endian) и его (данные из него) надо преобразовать в любую читаемую кодировку и читать его как XML. Вариант с WIN_WIDETOANSI(hb_MemoRead(hb_DirBase()+"test16.xml")) работает , но , куча вопросиков рождается в самом конце (писал выше). Дурдом с этим UTF-16......

SergKis: Dima пишет на входе XML в кодировке UTF-16 я думал сам файл. Тогда надо перекодировать только данные строк с Utf16 пробни с oXml выдернуть GUID значение и перевести только его WIN_WIDETOANSI

Dima: а есть разница Сергей ? переводить только нужную строку (значение) или весь файл с помощью WIN_WIDETOANSI попробую , но что мне кажется что будет глючить. отпишу... Спасибо !

Dima: Pasha пишет: Как вариант: перекодировать файл в utf-8, работать с ним Павел наверное знает как , но пока молчит.

Pasha: Перекодировать можно вызовом: Extern HB_CODEPAGE_UTF8, HB_CODEPAGE_UTF8EX, HB_CODEPAGE_UTF16LE .. c2 := HB_Translate(c1, 'UTF8', 'UTF16LE') ну и наоборот. И маленькая хитрость: вместо того, чтобы создавать промежуточные файлы, можно для класса HXMLDoc вместо метода read использовать метод ReadString: oXml:ReadString(HB_Translate(memoread(cFileName), 'UTF16LE', 'UTF8'))

Dima: Да Паш это работает , спасибо !

Dima: Из доки по мобильной проге [pre2] "3935BEAE-9F40-4BA5-BA9E-03F860CC1750" "3343E400-1577-4DDE-9A82-BF1E53267FD6" Идентификатор GUID имеет строго определенную структуру. Он состоит из 5 групп символов. Первая группа состоит из 8 символов, вторая – из 4 символов, третья – из 4 символов, четвертая – из 4 символов, пятая группа – из 12 символов. Не допускаются пробелы перед идентификатором и после идентификатора, указание разделителей "-" между символами в приведенных выше позициях обязательно. Фигурные скобки перед и после идентификатора недопустимы (принятое обозначение для идентификаторов в OLE). Допустимые символы в идентификаторе: от "0" до "9" и от "A" до "F" (или от "a" до "f"). [/pre2] А теперь вопрос. В моей программе в справочнике контрагентов коды организаций представлены в виде поля "kod_kl" "n" , 6 ,0. Все коды уникальны. Мобильная база ни чего про мои коды не знает а понимает только GUID. Есть ли функция преобразующая число в GUID и наоборот (из GUID получить мой обычный код) ?

PSP: Dima пишет: Есть ли функция преобразующая число в GUID и наоборот (из GUID получить мой обычный код) ? ЧислА длиной 6 знаков явно мало для отражения кода GUID. Может лучше в строку? Цифры из GUID от "0" до "9" преобразуются в "00" - "09", а цифры от "А" до "F" в "10" - "15". Обратно также. Т.е., на каждый символ GUID - 2 символа твоей строки. Дефисы оставить для удобства. Длина постоянна. Вариант 2: создать у себя поле GUID для соответствия kod_kl. update: точнее, имхо, вариант один: создать у себя поле GUID, чтобы получить однозначное соответствие с kod_kl

Pasha: Для хранения guid в числовом формате необходимо 16 байт, или 128 бит. Это 2 64-битных целых, учитывая нынешнюю архитектуру. Или две числовых переменных харбора. А его строковое представление - это просто запись в 16-ричном формате, с разбивкой на группы. Соответственно, преобразующая функция - это любая функция для преобразований 16-ричных значений. Но вопрос: стоит ли делать такие преобразования ? Может лучше привязать kod_kl к guid в его строковом представлении, как предложил PSP ?

Dima: То есть пойти тупо в лоб мануальным путем ? Есть у меня код клиента 123 Преобразую его так скажем в GUID , вида GUID="00000123-0001-0000-0000-000000000000" Где в первой части код клиента , во второй признак 1 что это контрагент Группы товара GUID="00000007-0002-0000-0000-000000000000" Где в первой части код группы , во второй признак 2 что это группа товара Товарная позиция GUID="00000301-0003-0000-0000-000000000000" Где в первой части код товара , во второй признак 3 что это товарная позиция C ихними GUID точно не пересечется. Как они посчитали GUID ниже х... знает [pre2] <ELEMENTS> <ITEM GUID="BD72D900-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="Торговый дом &quot;Комплексный&quot; " A02="0" A05="7705260699" A06="770501001" A07="" A04="(095) 1123456, доб. 789" A03="117452, Москва г, Симферопольский б-р, дом № 78, корпус 1" A09="112435, Москва, Одесская улица, дом № 67, корпус 1, кв.78" A010="ТД"/> <ITEM GUID="EF8F948C-8403-11DA-9AE9-000D884F5D77" IsDeleted="0" Name="Cтройснаб" A02="1" A05="7723240668" A06="772301001" A07="" A04="" A03="" A09="" A010="ССН"/> </ELEMENTS> [/pre2] Завтра задам вопрос разрабам.

Pasha: Дык A05 - это ИНН, A06 - КПП, что однозначно определяет контрагента

Dima: Pasha пишет: Дык A05 - это ИНН, A06 - КПП, что однозначно определяет контрагента Эти реквизиты заполнены не у всех :)

Dima: SergKis В общем сделал так в тестовом варианте , вроде пашет. [pre2] cc:=hb_MemoRead(hb_DirBase()+"tocdb.xml") oXml := HXMLDoc():ReadString( cc ) if oXml==nil return nil endif o:=oXml:find("DATAEXPORT") if o==nil return nil endif o1:=o:find("DOCUMENTS") if o1==nil return nil endif for i=1 to len(o1:aitems) j := o1:aItems[ i ] if j==nil return nil endif if j:title=="DOCUMENT" .and. j:GetAttribute("GUID")=="E01E1F5C-D6E4-46E8-B923-3758B0D79BDE" o2:=j:find("ELEMENTS") if o2==nil return nil endif for k=1 to len(o2:aitems) t:=o2:aItems[ k ] if t==nil return nil endif ? t:GetAttribute("GUID"),t:GetAttribute("DT"),t:GetAttribute("DocNumber") // читаем заголовок заявки t1:=t:find("TABLES") if t1==nil return nil endif t2:=t1:find("TABLE") if t2==nil return nil endif for z=1 to len(t2:aitems) // читаем содержимое заявки ee:=t2:aItems[ z ] ? ee:title,ee:GetAttribute("A05"),ee:GetAttribute("DocID") next next exit endif next [/pre2] Сам XML <?xml version="1.0" encoding="UTF-8"?> <DATAEXPORT mt="1.95"> <DOCUMENTS> <DOCUMENT GUID="E01E1F5C-D6E4-46E8-B923-3758B0D79BDE" Comment="Заказы" KILLALL="1"> <ELEMENTS> <ITEM GUID="00000001-0000-0000-0000-00005790AFF7" DT="2016-07-21T14:20:23" IsDeleted="0" IsPost="1" DocNumber="ORD0090B01A" A02="AAAAAAAA-8403-11DA-9AE9-000D884F5D77" A03="00001366-5E19-55CC-1000-15A4567E8788" A04="" A05="" A06="0" A07="" A071="666F1FA8-B78B-0003-9200-88CE8BCECF2B" A090="C1F49005-FCBD-449B-99A0-1B6C63992240" A08="43.5" A010="2016-07-23T14:20:23" A011="" A012="" A016="0" GUID_BACKPRODUCT="00000007-0000-0000-0000-00005790AFF7" A091="" > <TABLES> <TABLE GUID="0738E61B-F06F-464A-8483-4249E0254819"> <ITEM GUID="00000002-0000-0000-0000-00005790B07D" DocID="00000001-0000-0000-0000-00005790AFF7" A01="00002172-A789-34AC-1989-823456778888" A02="" A03="00000002-ABCD-CCCC-7777-888888888888" A04="1" A05="24.5" A06="24.5" A015="null" /> </TABLE> </TABLES> </ITEM> <ITEM GUID="00000001-0000-0000-0000-0000578CD6F0" DT="2016-07-18T16:17:36" IsDeleted="0" IsPost="1" DocNumber="ORD008CD703" A02="AAAAAAAA-8403-11DA-9AE9-000D884F5D77" A03="00001384-55BC-11D9-848A-00112F43529A" A04="" A05="" A06="0" A07="" A071="666F1FA8-B78B-0003-9200-88CE8BCECF2B" A090="C1F49005-FCBD-449B-99A0-1B6C63992240" A08="2343.7" A010="2016-07-20T16:17:36" A011="" A012="" A016="0" GUID_BACKPRODUCT="00000007-0000-0000-0000-0000578CD6F0" A091="" > <TABLES> <TABLE GUID="0738E61B-F06F-464A-8483-4249E0254819"> <ITEM GUID="00000002-0000-0000-0000-00005790AB6C" DocID="00000001-0000-0000-0000-0000578CD6F0" A01="00002172-A789-34AC-1989-823456778888" A02="" A03="00000002-ABCD-CCCC-7777-888888888888" A04="77" A05="24.5" A06="1886.5" A015="null" /> <ITEM GUID="00000002-0000-0000-0000-00005790ABC7" DocID="00000001-0000-0000-0000-0000578CD6F0" A01="00001C62-A789-34AC-1989-823456778888" A02="" A03="00000002-ABCD-CCCC-7777-888888888888" A04="12" A05="38.1" A06="457.2" A015="null" /> </TABLE> </TABLES> </ITEM> <ITEM GUID="00000001-0000-0000-0000-00005791B4F0" DT="2016-07-22T08:53:52" IsDeleted="0" IsPost="1" DocNumber="ORD0091B54D" A02="AAAAAAAA-8403-11DA-9AE9-000D884F5D77" A03="000012C1-5E19-55CC-1000-15A4567E8788" A04="" A05="" A06="0" A07="" A071="666F1FA8-B78B-0003-9200-88CE8BCECF2B" A090="C1F49005-FCBD-449B-99A0-1B6C63992240" A08="1269" A010="2016-07-24T08:53:52" A011="" A012="" A016="0" GUID_BACKPRODUCT="00000007-0000-0000-0000-00005791B4F0" A091="" > <TABLES> <TABLE GUID="0738E61B-F06F-464A-8483-4249E0254819"> <ITEM GUID="00000002-0000-0000-0000-00005791B508" DocID="00000001-0000-0000-0000-00005791B4F0" A01="000002A1-0002-34AC-1989-823456778888" A02="" A03="00000001-ABCD-CCCC-7777-888888888888" A04="3" A05="8.6" A06="25.8" A015="null" /> <ITEM GUID="00000002-0000-0000-0000-00005791B528" DocID="00000001-0000-0000-0000-00005791B4F0" A01="00000493-0002-34AC-1989-823456778888" A02="" A03="00000002-ABCD-CCCC-7777-888888888888" A04="14" A05="88.8" A06="1243.2" A015="null" /> </TABLE> </TABLES> </ITEM> <ITEM GUID="00000001-0000-0000-0000-00005791B55B" DT="2016-07-22T08:55:39" IsDeleted="0" IsPost="1" DocNumber="ORD0091B58F" A02="AAAAAAAA-8403-11DA-9AE9-000D884F5D77" A03="000013B8-5E19-55CC-1000-15A4567E8788" A04="" A05="" A06="0" A07="" A071="666F1FA8-B78B-0003-9200-88CE8BCECF2B" A090="C1F49005-FCBD-449B-99A0-1B6C63992240" A08="13291.2" A010="2016-07-24T08:55:39" A011="" A012="" A016="0" GUID_BACKPRODUCT="00000007-0000-0000-0000-00005791B55B" A091="" > <TABLES> <TABLE GUID="0738E61B-F06F-464A-8483-4249E0254819"> <ITEM GUID="00000002-0000-0000-0000-00005791B56D" DocID="00000001-0000-0000-0000-00005791B55B" A01="0004F50B-0002-34AC-1989-823456778888" A02="" A03="00000002-ABCD-CCCC-7777-888888888888" A04="85" A05="62" A06="5270" A015="null" /> <ITEM GUID="00000002-0000-0000-0000-00005791B579" DocID="00000001-0000-0000-0000-00005791B55B" A01="00000FF1-0002-34AC-1989-823456778888" A02="" A03="00000002-ABCD-CCCC-7777-888888888888" A04="89" A05="84.1" A06="7484.9" A015="null" /> <ITEM GUID="00000002-0000-0000-0000-00005791B583" DocID="00000001-0000-0000-0000-00005791B55B" A01="000012C8-0001-34AC-1989-823456778888" A02="" A03="00000001-ABCD-CCCC-7777-888888888888" A04="31" A05="17.3" A06="536.3" A015="null" /> </TABLE> </TABLES> </ITEM></ELEMENTS> </DOCUMENT> <DOCUMENT GUID="61DEE5FE-D0A8-4842-A6AF-A8D33F298845" Comment="Мерчендайзинг" KILLALL="1"> <ELEMENTS></ELEMENTS> </DOCUMENT> <DOCUMENT GUID="E59B1899-60C8-497E-99B1-6A04DEC063FA" Comment="Касса" KILLALL="1"> <ELEMENTS></ELEMENTS> </DOCUMENT> <DOCUMENT GUID="B49074D6-3C0C-4361-B71D-BBF446AB02B6" Comment="Задания" KILLALL="1"> <ELEMENTS></ELEMENTS> </DOCUMENT> <DOCUMENT GUID="4971B041-BEAB-4FA6-B1E8-10138F04FE44" Comment="Возврат товаров" KILLALL="1"> <ELEMENTS></ELEMENTS> </DOCUMENT> </DOCUMENTS> </DATAEXPORT>

SergKis: Dima Предлагаю подумать над таким решением (схема) [pre] aHDokum := hb_Hash() // список обраб. документов xml hb_HSet(aHDokum, "E01E1F5C-D6E4-46E8-B923-3758B0D79BDE", {|o,n| Zajavka1( o, n ) }) hb_HSet(aHDokum, "E01E1F5C-D6E4-46E8-B923-3758B0000ABC", {|o,n| Zajavka2( o, n ) }) ... // в коде ... // вместо // if j:title=="DOCUMENT" .and. j:GetAttribute("GUID")=="E01E1F5C-D6E4-46E8-B923-3758B0D79BDE" // делаем if j:title=="DOCUMENT" b := hb_HGetDef(aHDokum, j:GetAttribute("GUID"), Nil) If b != Nil Eval(b, j, i) EndIf ... Function Zajvka1( oXml, nElm ) Local b, i, k, s, v, oe, ot, ots, ote Local aStru := {...} // структура врем.файла куда съедать данные Local aHAtr := hb_Hash() hb_HSet(aHAtr, "GUID" , {|o,i,p,v| FieldPut(FieldPos(p), v) }) hb_HSet(aHAtr, "DT" , {|o,i,p,v| FieldPut(FieldPos(p), v) }) hb_HSet(aHAtr, "DocNumber", {|o,i,p,v| FieldPut(FieldPos(p), v) }) hb_HSet(aHAtr, "A05" , {|o,i,p,v| FieldPut(FieldPos(p), v) }) hb_HSet(aHAtr, "DocID" , {|o,i,p,v| FieldPut(FieldPos(p), v) }) oe := oXml:find("ELEMENTS") if oe == nil ? "Error xml structure" return .F. endif for k=1 to len(oe:aitems) ot:=o2:aItems[ k ] if ot==nil return .F. endif For i := 1 To len(ot:aAttr) s := ot:aAttr[ i ][1] b := hb_HGetDef(aHAtr, s, Nil) If b != Nil v := ot:aAttr[ i ][2] Eval( b, ot, i, s, v ) EndIf Next // ? t:GetAttribute("GUID"),t:GetAttribute("DT"),t:GetAttribute("DocNumber") // читаем заголовок заявки ots:=ot:find("TABLES") if ots==nil return .F. endif ote:=ots:find("TABLE") if ote==nil return .F. endif For i := 1 To len(ote:aAttr) s := ote:aAttr[ i ][1] b := hb_HGetDef(aHAtr, s, Nil) If b != Nil v := ote:aAttr[ i ][2] Eval( b, ote, i, s, v ) EndIf Next ... Return .T. Function Zajvka2( o ) ... Return .T. [/pre]

Dima: SergKis Спасибо , изучу подход

Dima: Есть вот такой XML , таблица в общем [pre2] <?xml version="1.0" encoding="utf-8"?> <points> <tt> <id>526645</id> <code1C>12345</code1C> <name>Зиневич проба</name> <client>Зиневич</client> <address></address> <lon>0</lon> <lat>0</lat> <radius>100</radius> <comment></comment> <user></user> <enabled>true</enabled> </tt> <tt> <id>526750</id> <code1C>359514069607817_new_01-03-04</code1C> <name>чп Тригуба</name> <client>Завгородний</client> <address>Таврийск, вулиця Зои Комсмедемянской 15</address> <lon>33.4453</lon> <lat>46.7576</lat> <radius>100</radius> <comment>работаем</comment> <user></user> <enabled>false</enabled> </tt> </points> [/pre2] Попытался ее прочитать с помощью библитеки Кресина. [pre2] oXml := HXMLDoc():ReadString( hb_MemoRead("1.xml") ) if oXml==nil return nil endif o:=oXml:find("points") if o==nil return endif FOR i=1 to len(o:aitems) o1 := o:aItems[ i ] // полагал что тут будет работать o1:GetAttribute("id") или o1:GetAttribute("code1C") но выдает NIL // поэтому слепил код что ниже //? hb_valtoexp(o1) if o1:Title=="tt" for j=1 to len(o1:aitems) o2:=o1:aItems[ j ] ? o2:Title,if( len(o2:Aitems)#0,o2:Aitems[1],"") next endif wait NExt [/pre2] Вопрос в коменте кода. Не так его разбираю что ли ?

SergKis: Dima Атрибут это внутри тега <tag1 attr1 = "aaa" attr2 = "bbb">value</tag1> получив oXml сделай for i := 1 to len(oXml:aItems) ? valtype(oXml:aItems[ i ]), oXml:aItems[ i ] next и см. что там

SergKis: PS если обект, то ? oXml:aItems[ i ]:Title

Dima: Сергей Tiltle я считал , показал как в коде выше А как считать значение ? Получается только так [pre2] if o1:Title=="tt" for j=1 to len(o1:aitems) o2:=o1:aItems[ j ] ? o2:Title,if( !empty(o2:Aitems),o2:Aitems[ 1] ,"--------") next endif [/pre2] В общем ладно , работает да и бог с ним. Спасибо ! На выходе по этому коду что выше получаю так [pre2] id 526645 code1C 12345 name Зиневич проба client Зиневич address -------- lon 0 lat 0 radius 100 comment -------- user -------- enabled true [/pre2]

SergKis: Dima Если бы прокрутил цикл, увидел, как все устроено, т.е. o:title == "points" будет содержать объект, в котором o:find('tt') вернет обект, в котором o:find('id') вернет значение id тега, т.е. извлекаем данные o:find('code1C') и т.д.

Dima: SergKis Попробовал , не получилось. Оставил так [pre2] o:=oXml:find("points") if o==nil return endif FOR i=1 to len(o:aitems) o1 := o:aItems[ i ] if o1:Title=="tt" for j=1 to len(o1:aitems) o2:=o1:aItems[ j ] ? o2:Title,if( !empty(o2:Aitems),o2:Aitems[ 1 ],"--------") next endif NEXT [/pre2]

SergKis: Dima пишет Попробовал , не получилось. Глянул у себя, почему работает ? Нашел - правил метод Find[pre2] METHOD Find( cTitle,nStart,block ) CLASS HXMLNode Local i IF nStart == Nil nStart := 1 ENDIF If len(::aItems) == 1 .and. Valtype(::aItems[1]) == "C" Return ::aItems[1] EndIf DO WHILE .T. i := Ascan( ::aItems,{|a|Valtype(a)!="C".AND.a:title==cTitle},nStart ) IF i == 0 EXIT ELSE nStart := i IF block == Nil .OR. Eval( block,::aItems ) Return ::aItems ELSE nStart ++ ENDIF ENDIF ENDDO Return Nil [/pre2]

Dima: Понял Сергей. Не люблю я править авторские сырцы. Спасибо за желание помочь !

SergKis: Dima пишет Не люблю я править авторские сырцы. А как же open source ? С изменениями, твой код выглядел бы (как вариант) так[pre2] FUNCTION Main() Local a,i,n,v,op,ot,aV := {},aA := {} If ( oXml := HXMLDoc():ReadString( hb_MemoRead("1.xml") ) ) == NIL return Nil endif If ( op := oXml:find("points") ) == NIL return Nil endif n := {'id' , ; // что выбирать - заказ 'code1C' , ; 'client' , ; 'address', ; 'lon' , ; 'lat' , ; 'radius' , ; 'comment', ; 'user' , ; 'enabled' ; } For i := 1 To len(op:aItems) ot := op:aItems[ i ] v := {} a := {} If hb_IsObject(ot) .and. ot:title == 'tt' AEval(n, {|t| aAdd(v, op:find(t)) }) // по заказу или AEval(ot:aItems, {|o| aAdd(a, {o:title, o:find(o:title)}) }) // все выбираем aAdd(aV, v) aAdd(aA, a) EndIf Next RETURN NIL [/pre2]



полная версия страницы