Форум » [x]Harbour » Экспорт данных в XML » Ответить

Экспорт данных в XML

Dr. Oldwarez: Предыдущая прога уже готова и отлично работает. Но шефу надо выводить данные в универсальный формат обмена данными XML, причём с несколькими уровнями иерархии. Как заставить Harbour работать с форматом XML? Моя среда: BCC55+harbour+MiniGUI Extended

Ответов - 15

Pasha: Я использую класс из hwgui Этот же класс есть в поставке minigui: source\hbxml В harbour есть библиотечка contrib\hbmxml В xHarbour есть класс TXmlDocument, он же есть и в Harbour Выбирай - не хочу

Dr. Oldwarez: Спасибо большое! Но где бы документацию взять?

Pasha: Документации как таковой по этим классам нет Но классы несложные, примеры их использования имеются, и этого вполне достаточно для их освоения


krutoff: Я использую уже давно - посмотрите фрагмент моего кода, может поможет "... oXmlDoc := TXmlDocument():New('<?xml version="1.0" encoding="windows-1251" ?>') oXmlRoot := TXmlNode():new(0,"DECLAR",{ "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", ; "xsi:noNamespaceSchemaLocation" => aTBL[nT]+".xsd" } oXmlDoc:oRoot:addBelow( oXmlRoot ) oXmlHead := TXmlNode():new(0, "DECLARHEAD" ) oXmlRoot:addBelow( oXmlHead ) oXmlHead:addBelow( TXmlNode():new(0, "VER",,"1.1") ) ..."

Andrey: krutoff пишет: посмотрите фрагмент моего кода, может поможет Ничего не понятно. Дайте хоть первоначальную информацию.... Зачем как и почему. А лучше тестовый пример маленький, выгрузка базы например. Заранее спасибо !

SADSTAR4: я в былые времена начала XML делал файлы для налоговой как обычный текстовый файл с последовательным созданием тэгов

Dima: Andrey пишет: Дайте хоть первоначальную информацию.... http://www.rsdn.ru/article/xml/xml-1.xml

Andrey: Dima пишет: http://www.rsdn.ru/article/xml/xml-1.xml Спасибо ! А дальше ? По примеру ?

Wolfv: Не знаю или актуально, но еще как вариант через DOMDocument. Типа так (заполнение данными шаблона XML) : xmlDoc := CreateObject( "Msxml2.DOMDocument.6.0" ) xmlDoc:async := FALSE xmlDoc:load("Test.xml" ) xmlErr := xmlDoc:parseError IF xmlErr:errorCode <> 0 MsgExclamation( "Ошибка, код: " + AllTrim( Str( xmlErr:errorCode ) ) ) RETURN .f. ENDIF objNodeList := xmlDoc:getElementsByTagName("Tag1" ) objNodeList:item( 0 ):text = "Значение для Tag1" .... .... // создать элемент newElem := xmlDoc:createElement( "SECPARAM" ) objNodeList1:appendChild( newElem ) objNodeList1:lastChild:text = "Значение" .... xmlDoc:async := FALSE xmlDoc:validateOnParse := TRUE xmlDoc:save( "fileOut" )

rvu: А загрузить базу так можно? Могу я с помощью xHarbour взять из интернета файл и прочитать из него данные в программу?

Dr. Oldwarez: krutoff пишет: Я использую уже давно - посмотрите фрагмент моего кода, может поможет "... oXmlDoc := TXmlDocument():New('<?xml version="1.0" encoding="windows-1251" ?>') oXmlRoot := TXmlNode():new(0,"DECLAR",{ "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", ; "xsi:noNamespaceSchemaLocation" => aTBL[nT]+".xsd" } oXmlDoc:oRoot:addBelow( oXmlRoot ) oXmlHead := TXmlNode():new(0, "DECLARHEAD" ) oXmlRoot:addBelow( oXmlHead ) oXmlHead:addBelow( TXmlNode():new(0, "VER",,"1.1") ) ..." Это хорошо, но как это сделать в ДОСявом Клиппере? Как только сейчас выяснилось, шефу нужен уже даже не PDF, а электронный документ особого формата. Пока что удалось выяснить, что это XML. Такая вот хрень, примерно. [pre2]<ubl:Invoice xmlns:ubl="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"> <!-- XRechnung created by Invoice Portal powered by Webware Internet Solutions GmbH --> <!-- For more information visit our Website: https://invoice-portal.de --> <!-- Or contact us by E-Mail: info@invoice-portal.de --> <cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</cbc:CustomizationID> <cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID> <cbc:ID>RE-2024-03</cbc:ID> <cbc:IssueDate>2024-02-27</cbc:IssueDate> <cbc:DueDate>2024-03-28</cbc:DueDate> <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode> <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode> <cbc:BuyerReference>992-90009-96</cbc:BuyerReference> <cac:AccountingSupplierParty> <cac:Party> <cbc:EndpointID schemeID="9918">DE16520503531004885412</cbc:EndpointID> <cac:PostalAddress> <cbc:StreetName>Teichstr. 15</cbc:StreetName> <cbc:CityName>Berlin</cbc:CityName> <cbc:PostalZone>10232</cbc:PostalZone> <cac:Country> <cbc:IdentificationCode>DE</cbc:IdentificationCode> </cac:Country> </cac:PostalAddress> <cac:PartyTaxScheme> <cbc:CompanyID>279247134</cbc:CompanyID> <cac:TaxScheme> <cbc:ID>FC</cbc:ID> </cac:TaxScheme> </cac:PartyTaxScheme> <cac:PartyLegalEntity> <cbc:RegistrationName>PC Service GmbH</cbc:RegistrationName> <cbc:CompanyID>279247134</cbc:CompanyID> </cac:PartyLegalEntity> <cac:Contact> <cbc:Name>Max Siebert</cbc:Name> <cbc:Telephone>0312424323</cbc:Telephone> <cbc:ElectronicMail>max.siebert@pc-service-berlin.de</cbc:ElectronicMail> </cac:Contact> </cac:Party> </cac:AccountingSupplierParty> <cac:AccountingCustomerParty> <cac:Party> <cbc:EndpointID schemeID="9930">DE279247134</cbc:EndpointID> <cac:PostalAddress> <cbc:StreetName>Bergstr. 25</cbc:StreetName> <cbc:CityName>Frankfurt</cbc:CityName> <cbc:PostalZone>54632</cbc:PostalZone> <cbc:CountrySubentity>Hessen</cbc:CountrySubentity> <cac:Country> <cbc:IdentificationCode>DE</cbc:IdentificationCode> </cac:Country> </cac:PostalAddress> <cac:PartyLegalEntity> <cbc:RegistrationName>DB Service GmbH</cbc:RegistrationName> <cbc:CompanyID>DE279247134</cbc:CompanyID> </cac:PartyLegalEntity> </cac:Party> </cac:AccountingCustomerParty> <cac:Delivery> <cbc:ActualDeliveryDate>2024-02-24</cbc:ActualDeliveryDate> </cac:Delivery> <cac:PaymentMeans> <cbc:PaymentMeansCode>42</cbc:PaymentMeansCode> <cac:PayeeFinancialAccount> <cbc:ID>DE13520503531004885466</cbc:ID> <cbc:Name>Viktor Settel</cbc:Name> <cac:FinancialInstitutionBranch> <cbc:ID>HELADEF1KAS</cbc:ID> </cac:FinancialInstitutionBranch> </cac:PayeeFinancialAccount> </cac:PaymentMeans> <cac:TaxTotal> <cbc:TaxAmount currencyID="EUR">204.06</cbc:TaxAmount> <cac:TaxSubtotal> <cbc:TaxableAmount currencyID="EUR">1074.00</cbc:TaxableAmount> <cbc:TaxAmount currencyID="EUR">204.06</cbc:TaxAmount> <cac:TaxCategory> <cbc:ID>S</cbc:ID> <cbc:Percent>19.00</cbc:Percent> <cac:TaxScheme> <cbc:ID>VAT</cbc:ID> </cac:TaxScheme> </cac:TaxCategory> </cac:TaxSubtotal> </cac:TaxTotal> <cac:LegalMonetaryTotal> <cbc:LineExtensionAmount currencyID="EUR">1074.00</cbc:LineExtensionAmount> <cbc:TaxExclusiveAmount currencyID="EUR">1074.00</cbc:TaxExclusiveAmount> <cbc:TaxInclusiveAmount currencyID="EUR">1278.06</cbc:TaxInclusiveAmount> <cbc:AllowanceTotalAmount currencyID="EUR">0.00</cbc:AllowanceTotalAmount> <cbc:ChargeTotalAmount currencyID="EUR">0.00</cbc:ChargeTotalAmount> <cbc:PrepaidAmount currencyID="EUR">0.00</cbc:PrepaidAmount> <cbc:PayableRoundingAmount currencyID="EUR">0.00</cbc:PayableRoundingAmount> <cbc:PayableAmount currencyID="EUR">1278.06</cbc:PayableAmount> </cac:LegalMonetaryTotal> <cac:InvoiceLine> <cbc:ID>1</cbc:ID> <cbc:InvoicedQuantity unitCode="C62">2.000000</cbc:InvoicedQuantity> <cbc:LineExtensionAmount currencyID="EUR">934.00</cbc:LineExtensionAmount> <cac:Item> <cbc:Name>PC Fujitsu TX-23</cbc:Name> <cac:ClassifiedTaxCategory> <cbc:ID>S</cbc:ID> <cbc:Percent>19.00</cbc:Percent> <cac:TaxScheme> <cbc:ID>VAT</cbc:ID> </cac:TaxScheme> </cac:ClassifiedTaxCategory> </cac:Item> <cac:Price> <cbc:PriceAmount currencyID="EUR">467.000000</cbc:PriceAmount> </cac:Price> </cac:InvoiceLine> <cac:InvoiceLine> <cbc:ID>2</cbc:ID> <cbc:InvoicedQuantity unitCode="C62">2.000000</cbc:InvoicedQuantity> <cbc:LineExtensionAmount currencyID="EUR">140.00</cbc:LineExtensionAmount> <cac:Item> <cbc:Name>PC Installation</cbc:Name> <cac:ClassifiedTaxCategory> <cbc:ID>S</cbc:ID> <cbc:Percent>19.00</cbc:Percent> <cac:TaxScheme> <cbc:ID>VAT</cbc:ID> </cac:TaxScheme> </cac:ClassifiedTaxCategory> </cac:Item> <cac:Price> <cbc:PriceAmount currencyID="EUR">70.000000</cbc:PriceAmount> </cac:Price> </cac:InvoiceLine> </ubl:Invoice>[/pre2] ubl - Universal Business Language, частный случай XML. Просто выпечатывать в текстовый файл из-под DOSa -- будут проблемы с ESC. Времени на нормальную портировку на Винду и Harbour у меня нет -- шеф хочет, чтобы я сделал всё до конца июня. А прога там огромная -- на 2,5 мега одних исходников. Портировка займет в лучшем случае год.

alkresin: Dr. Oldwarez пишет: Просто выпечатывать в текстовый файл из-под DOSa -- будут проблемы с ESC Какие проблемы с ESC?

SergKis: Dr. Oldwarez пишет но как это сделать в ДОСявом Клиппере? Как всегда в clipper, делаете txt файл[ы] структуры документов 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>^OH_2</InvoiceDate> <InvoiceCurrency>^OH_3</InvoiceCurrency> <InvoicePaymentDueDate>^mDtoS(Date()+10, "-")</InvoicePaymentDueDate> <InvoicePaymentTerms>10</InvoicePaymentTerms> <InvoicePostDate>^-</InvoicePostDate> <DocumentFunctionCode>O</DocumentFunctionCode> <DocumentNameCode>380</DocumentNameCode> <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()+10, "-")</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>^-</StreetAndNumber> <CityName>^-</CityName> <PostalCode>^-</PostalCode> <Country>^-</Country> </Buyer> <Payer> <ILN>^OP_1</ILN> <TaxID>^-</TaxID> <CodeBySeller>^-</CodeBySeller> <CodeByBuyer>^-</CodeByBuyer> <UtilizationRegisterNumber>^-</UtilizationRegisterNumber> <Name>^-</Name> <StreetAndNumber>^-</StreetAndNumber> <CityName>^-</CityName> <PostalCode>^-</PostalCode> <Country>^-</Country> </Payer> <Invoicee> <ILN>^OP_1</ILN> <TaxID>^-</TaxID> <CodeBySeller>^-</CodeBySeller> <CodeByBuyer>^-</CodeByBuyer> <UtilizationRegisterNumber>^-</UtilizationRegisterNumber> <Name>^-</Name> <StreetAndNumber>^-</StreetAndNumber> <CityName>^-</CityName> <PostalCode>^-</PostalCode> <Country>^-</Country> </Invoicee> <Seller> <ILN>^OP_6</ILN> <TaxID>^-</TaxID> <CodeBySeller>^-</CodeBySeller> <CodeByBuyer>^-</CodeByBuyer> <UtilizationRegisterNumber>^-</UtilizationRegisterNumber> <Name>^-</Name> <StreetAndNumber>^-</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>^-</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] Секцию строк документа <Invoice-Lines>...</Invoice-Lines>, выделена цветом читаете в цикле на документостроки своих документов. Строки с "^-" в тэгах могут быть выкинуты вместе с тэгами или делаться пустыми по вашей ситуации, например <CodeByBuyer>^-</CodeByBuyer> на выход может давать <CodeByBuyer></CodeByBuyer> или не давать тэг на выход целиком. NR_2, ..., OH_2, ..., OP_1, ..., LN_16, LN_11, ..., OS_4, OS_6 ... - это поля dbf

Pasha: Dr. Oldwarez пишет: Это хорошо, но как это сделать в ДОСявом Клиппере? Но вот зачем эти мучения ? Не проще ли пересобрать клиппер-программу под терминальное 32-х битное приложение Харбор, которое прекрасно будет работать под winxp и старше ? И сразу же откроется целый новый мир, в том числе работа с xml, и много чего еще ? И ads там поддерживается

MIKHAIL: Pasha пишет: Но вот зачем эти мучения ? Не проще ли пересобрать клиппер-программу под терминальное 32-х битное приложение Харбор, которое прекрасно будет работать под winxp и старше ? И сразу же откроется целый новый мир, в том числе работа с xml, и много чего еще ? И ads там поддерживается Если прога большая, то на начальном этапе, можно собрать и отдельные модули на Харборе, которые решают локальные задачи и вызывать их из основной



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