Пишу парсер для xml файлов, но проблема в том, что в файле кодировка:
encoding=»windows-1251″.
Когда перевел кодировку в ut8 то следующем кодом смог распарсить документ.
for _, file := range files {
_, filename := utils.Unzip("/Users/farex/upload/"+file.Filename, "/Users/farex/upload/")
_ = filename
///---------- Open our xmlFile-----------------------
for _, file := range filename {
xmlFile, err := os.Open("/Users/farex/upload/" + file)
// if we os.Open returns an error then handle it
if err != nil {
fmt.Println(err)
}
fmt.Println("Successfully Opened " + file)
if utils.Cut(file, 1) == "H" {
defer xmlFile.Close()
byteValue, _ := ioutil.ReadAll(xmlFile)
var zl_list models.ZL_LIST
xml.Unmarshal(byteValue, &zl_list)
fmt.Println("---ZGLV---")
fmt.Println("VERSION" + zl_list.ZGLV[0].VERSION)
fmt.Println("DATA" + zl_list.ZGLV[0].DATA)
fmt.Println("FILENAME" + zl_list.ZGLV[0].FILENAME)
fmt.Println("SD_z" + zl_list.ZGLV[0].SD_Z)
Это все работает, но задача парсить не Документы в формате utf8 , а в cp-1251.
Как можно «конвертировать» cp-1251 в utf-8 ?
Добавил меторд:
func EncodeWindows1251(ba []uint8) []uint8 {
enc := charmap.Windows1251.NewEncoder()
out, _ := enc.String(string(ba))
return []uint8(out)
}
и соответственно вызываю его:
byteValue, _ := ioutil.ReadAll(xmlFile)
a := EncodeWindows1251(byteValue)
var zl_list models.ZL_LIST
xml.Unmarshal(a, &zl_list)
Тоже не работает…
Но если из документа убрать строку <?xml version="1.0" encoding="windows-1251"?>
.
То все работает и документ парсится… Неужели придется регуляркой удалять эту строчку в документе?
Добавил метод наисанный ниже и за импортировал. «golang.org/x/text/encoding/charmap».
Но:
Образец файла xml тут кодировка cp-1251
19.07.22 — 09:47
Есть следующий формат файла для ЕИС Госзакупок.
Описан здесь
https://zakupki.gov.ru/epz/main/public/download/downloadDocument.html?id=36503
Получился такой файлик
<?xml version=»1.0″ encoding=»WINDOWS-1251″?>
<ФайлПакет ИдТрПакет=»37B62CBA-66A5-4722-A350-5AF49F97E111″ ИдФайл=»ON_NSCHFDOPPR_2ZK-CUS-03223001038_2ZK-SUP-00019150656_20220715_37B62CBA-66A5-4722-A350-5AF49F97E98E» ДатаВрФормир=»2022-07-19T00:00:01″ ТипПрилож=»УПДПрод» ВерсФорм=»1.00″ ИдОтпр=»2ZK-SUP-00019150656″ ИдПол=»2ZK-CUS-03223001038″>
<Документ>
<Контент>PNCk много букв base64 Pg==</Контент>
</Файл>
</Документ>
</ФайлПакет>
Но выдает ошибку
РДИК_ИК_0003. Ошибка валидации xml-документа «DP_PAKET»: cvc-datatype-valid.1.2.1: ‘PNCk много букв base64 Pg==’ is not a valid value for ‘base64Binary’.
Что означает эта ошибка?
Формировал base64Binary следующим кодом в 1С
ВременныйФайл = ПолеВвода3;
ЗаписьТекста = Новый ЗаписьТекста(ВременныйФайл, «CESU-8»);
ЗаписьТекста.Записать(ПолеВвода1);
ЗаписьТекста.Закрыть();
ДД_Файла = Новый ДвоичныеДанные(ВременныйФайл);
ПолеВвода2 = Base64Строка(ДД_Файла);
Потом ПолеВвода2 скопировал в тег «Контент» непосредственно в блокноте.
Как создать рабочий файлик чтобы хоть посмотреть как он выглядит?
1 — 19.07.22 — 09:50
Есть наше обращение в техподдержку ЕИС Госзакупок. Может поможет чем…
Вопрос…
Работает ли загрузка документа приемки из файла?
Описание:
Здравствуйте.
1. Зашли в контракты
2. Для отправленного заказчику документа о приемке выбрали «Скачать архив документов»
3. В УПД из архива поменяли ГУИД в имени файла и в тексте xml документа тоже поменяли аттрибут Файл.
4. Поменяли порядковый номер документа и дату первичного документа в тексте xml файла.
5. Попытались загрузить.
6. Выдало ошибку РДИК_ИК_0003. Ошибка валидации xml-документа «DP_PAKET»: cvc-elt.1.a: Cannot find the declaration of element ‘Файл’.
Работает ли Ваша опция загрузки? Или наш подход в корне не верен и выгруженный из ЕИС но подредактированный файл нельзя подгрузить в ЕИС снова?
******************************* Ответ **************************************
Уважаемый пользователь!
Контроль РДИК_ИК_0003 возникает по причине не корректно сформированного транспортного пакета.
Загружается xml-файл (транспортный пакет), не соответствующий интеграционным схемам ЕИС.
Для успешной обработки необходимо передавать транспортный пакет (ФайлПакет) сформированный согласно схеме DP_PAKET_EIS_01_00.xsd.
В составе загружаемого в ЕИС транспортного пакета должны передаваться:
•УПД или УКД
•Приложение к документу, которое является составной и неотъемлемой частью УПД (титул продавца) или УКД (титул продавца) в схеме DP_PACKET_EIS_01_00
Сам пакет должен содержать:
•soap-оболочку (при загрузке xml-файла непосредственно в личном кабинете поставщика soap-оболочка не требуется)
•Шапка (ФайлПакет)
•Документ/Контент в base64 (содержит УПД или УКД)
•Прилож/Контент в base64 (содержит ФайлУПДПрод / ФайлУКДПрод)
УПД — Универсальный передаточный документ (титул Продавца). Интеграционная схема ON_NSCHFDOPPR_1_997_01_05_01_02
УКД — Универсальный корректировочный документ. Интеграционная схема ON_NKORSCHFDOPPR_1_996_03_05_01_01
Отметим, что передаваемые сведения должны иметь кодировку windows-1251 (В шапке ФайлПакет, Файл, ФайлУПДПрод/ФайлУКДПрод необходимо указывать <?xml version=»1.0″ encoding=»windows-1251″ ?>).
Структура документов указана в Схемах Эл. Акт. 12.2 и описана в Альбоме ТФФ Эл Акт 12.2 размещенных в открытой части ЕИС.
https://zakupki.gov.ru/epz/main/public/document/view.html?searchString=§ionId=432&strictEqual=false
2 — 20.07.22 — 01:33
Вверх.
3 — 20.07.22 — 07:20
Удалось победить первое препятствие
код обработки заменил на
ПотокВПамяти = Новый ПотокВПамяти();
Текст = Новый ЗаписьТекста(ПотокВПамяти, КодировкаТекста.UTF8, , Символы.ПС);
Текст.Записать(ПолеВвода1);
Текст.Закрыть();
ДвоичныеДанные = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
СтрокаФорматBase64 = Base64Строка(ДвоичныеДанные);
СтрокаФорматBase64 = СтрЗаменить(СтрокаФорматBase64, Символы.ВК, «»);
СтрокаФорматBase64 = СтрЗаменить(СтрокаФорматBase64, Символы.ПС, «»);
ПолеВвода2 = СтрокаФорматBase64;
И всё прошло. Но возникла новая проблема
ЕИС ругается на Element type «Р» must be followed by either attribute specifications, «>» or «/>».
Яндекс.Валидатор XML + XSD тоже выдает такую же ошибку причем пишет что сервис временно недоступен.
В XML видимых ошибок нет. Тег «Контент» можно декодировать на сайте http://base64.ru/
Иностранный валидатор XML + XSD https://www.freeformatter.com/xml-validator-xsd.html ошибок не выдает. Жду ответа от техподдержки ЕИСа.
4 — 20.07.22 — 07:27
Ну, вообще тебе английским по-белому писало ошибку что в (0) что сейчас. В (0) была проблема с <Контент> как раз то, что ты не написал. В теле ожидалась строка base64Binary, у тебя там были какие-то недопустимые символы. В (3) у тебя где-то в XML незакрытый элемент <p>. То есть он буквально тебе пишет, что открытие тега <p> должно сопровождаться его закрытием. Посмотреть это можно в любой удобной гляделке XML — в браузере или notepad++ с компонентой для XML, например. Не видя что ты там формируешь что-то тебе ещё посоветовать невозможно.
5 — 20.07.22 — 07:29
Вариант — у тебя где-то шифруется что то вроде <p или <p>, например, если ты код маркировки передаёшь — это возможно. Тогда надо символы < и > экранировать.
6 — 20.07.22 — 09:51
(4) <?xml version=»1.0″ encoding=»WINDOWS-1251″?>
<Файл ИдФайл=»ON_NSCHFDOPPR_2ZK-CUS-03223001038_2ZK-SUP-00019150656_20220715_37B62CBA-66A5-4722-A350-5AF49F97E98E» ВерсФорм=»5.01″ ВерсПрог=»12.2″>
<СвУчДокОбор ИдОтпр=»2ZK-SUP-00019150656″ ИдПол=»2ZK-CUS-03223001038″>
<СвОЭДОтпр НаимОрг=»Федеральное казначейство» ИННЮЛ=»7710568760″ ИдЭДО=»2ZK»/>
</СвУчДокОбор>
<Документ КНД=»1115131″ Функция=»СЧФДОП» ПоФактХЖ=»Документ об отгрузке товаров (выполнении работ), передаче имущественных прав (документ об оказании услуг)» НаимДокОпр=»Счет-фактура и документ об отгрузке товаров (выполнении работ), передаче имущественных прав (документ об оказании услуг)» ДатаИнфПр=»15.07.2022″ ВремИнфПр=»01.44.16″ НаимЭконСубСост=»ИВАНОВА ОЛЬГА ВЛАДИМИРОВНА» СоглСтрДопИнф=»0000.0000.0000″>
<СвСчФакт НомерСчФ=»4″ ДатаСчФ=»20.07.2022″ КодОКВ=»643″>
<СвПрод>
<ИдСв>
<СвИП ИННФЛ=»123456789012″>
<ФИО Фамилия=»ИВАНОВА» Имя=»ОЛЬГА» Отчество=»ВЛАДИМИРОВНА»/>
</СвИП>
</ИдСв>
<Адрес>
<АдрРФ КодРегион=»99″ Город=»Г ИВАНОВО»/>
</Адрес>
<Контакт Тлф=»7 999 999 9999″ ЭлПочта=»hleb@mail.ru»/>
<БанкРекв НомерСчета=»99999999999999999999″>
<СвБанк НаимБанк=»ПАО СБЕРБАНК» БИК=»999999999″ КорСчет=»99999999999999999999″/>
</БанкРекв>
</СвПрод>
<СвПокуп ОКПО=»99999999″ ИнфДляУчаст=»0″ КраткНазв=»МБДОУ ДЕТСКИЙ САД»>
<ИдСв>
<СвЮЛУч НаимОрг=»МУНИЦИПАЛЬНОЕ БЮДЖЕТНОЕ ДОШКОЛЬНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ДЕТСКИЙ САД» ИННЮЛ=»9999999999″ КПП=»999999999″/>
</ИдСв>
<Адрес>
<АдрРФ Индекс=»999999″ КодРегион=»99″ Город=»ГОРОД ИВАНОВО» Улица=»УЛИЦА ИВАНОВА» Дом=»ДОМ 9″/>
</Адрес>
<Контакт Тлф=»8 999 999 99 99″ ЭлПочта=»dou@yandex.ru»/>
<БанкРекв НомерСчета=»99999999999999999999″>
<СвБанк НаимБанк=»УФК по Иваново» БИК=»999999999″ КорСчет=»99999999999999999999″/>
</БанкРекв>
</СвПокуп>
<ДопСвФХЖ1 НаимОКВ=»Российский рубль»>
<ИнфПродГосЗакКазн ДатаГосКонт=»14.06.2022″ НомерГосКонт=»999 999″/>
</ДопСвФХЖ1>
<ДокПодтвОтгр НаимДокОтгр=»Документ о приемке» НомДокОтгр=»2″ ДатаДокОтгр=»15.07.2022″/>
</СвСчФакт>
<ТаблСчФакт>
<СведТов НомСтр=»1″ НаимТов=»Хлеб пшеничный» ОКЕИ_Тов=»166″ КолТов=»4.8″ ЦенаТов=»100.33″ СтТовБезНДС=»481.58″ НалСт=»без НДС» СтТовУчНал=»481.58″>
<Акциз>
<БезАкциз>без акциза</БезАкциз>
</Акциз>
<СумНал>
<БезНДС>без НДС</БезНДС>
</СумНал>
<ДопСведТов ПрТовРаб=»1″ НаимЕдИзм=»Килограмм» КодТов=»10.71.11.110″/>
</СведТов>
<СведТов НомСтр=»2″ НаимТов=»Хлеб ржано-пшеничный» ОКЕИ_Тов=»166″ КолТов=»2.8″ ЦенаТов=»99″ СтТовБезНДС=»277.2″ НалСт=»без НДС» СтТовУчНал=»277.2″>
<Акциз>
<БезАкциз>без акциза</БезАкциз>
</Акциз>
<СумНал>
<БезНДС>без НДС</БезНДС>
</СумНал>
<ДопСведТов ПрТовРаб=»1″ НаимЕдИзм=»Килограмм» КодТов=»10.71.11.110″/>
</СведТов>
<ВсегоОпл СтТовБезНДСВсего=»758.78″ СтТовУчНалВсего=»758.78″>
<СумНалВсего>
<БезНДС>без НДС</БезНДС>
</СумНалВсего>
</ВсегоОпл>
</ТаблСчФакт>
<СвПродПер>
<СвПер СодОпер=»Работы выполнены в полном объеме» ДатаПер=»04.07.2022″>
<ОснПер НаимОсн=»Контракт» НомОсн=»999 9999″ ДатаОсн=»14.06.2022″ ДопСвОсн=»Реестровый номер в реестре контрактов: 9999999999999999999″/>
<ТранГруз/>
</СвПер>
</СвПродПер>
<Подписант ОблПолн=»5″ Статус=»4″ ОснПолн=»Должностные обязанности»>
<ИП ИННФЛ=»123456789012″>
<ФИО Фамилия=»ИВАНОВА» Имя=»ОЛЬГА» Отчество=»ВЛАДИМИРОВНА»/>
</ИП>
</Подписант>
</Документ>
</Файл>
prog1Csww
7 — 21.07.22 — 02:18
Ответ техподдержки
Уважаемый пользователь!
Несмотря на то, что в прологе титула продавца указана кодировка <?xml version=»1.0″ encoding=»WINDOWS-1251″?> сведения закодированы в UTF-8.
Просьба сведения, находящиеся в Документ/Контент, формировать в windows-1251, а затем кодировать в base64.
Также отметим, что в загружаемом транспортном пакете отсутствует приложение к титулу продавца (ФайлУПДПрод), которое является составной и неотъемлемой частью УПД (титул продавца) и передается в блоке Прилож/Контент.
Просьба корректно формировать загружаемый xml-файл.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс
Почему браузер ругается? Пробовал и кавычки менять и вроде теги все закрыты…
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE yml_catalog SYSTEM "shops.dtd">
<yml_catalog date="2018-01-30 17:40">
<shop>
<name>Магазин</name>
<company>Nest</company>
<url>http://www.test.ru</url>
<version>Выгрузка для сайта test.net</version>
<category id='124'>Основной раздел каталога</category>
<offers>
<offer>
<vendor>Silhouette</vendor>
<model>TMA Pilot</model>
<color>Черный</color>
<price>13590</price>
<url>http://www.test.ru/123/</url>
<picture>http://www.test.ru/upload/393c0.jpg</picture>
<category>Фигня</category>
</offer>
</offers>
</shop>
</yml_catalog>
Parse error: syntax error, unexpected ‘version’
(T_STRING) in /home/bitrix/www/yandex/new.php on line 1
Здравствуйте! Отправила отчет СЗВ-М , пришел вот такой ответ<?xml version=»1.0″ encoding=»WINDOWS-1251″?>
-<ошибка>
<описание>Документооборот:3e02feb845444f65a0d97a56 3aa6b19c Транзакция :b96cbc7da26e41d7b760e9d667ac05ee ошибка при распаковке сообщения b96cbc7da26e41d7b760e9d667ac05ee :Сообщение не зашифровано или формат сообщения искажен</описание>
</ошибка> , хотя проверочная программа не нашла никаких ошибок
← →
smart
(2011-03-14 09:40)
[0]
Здравствуйте! Как изменить кодировку xml? При <?xml version="1.0" encoding="windows-1251" ?>
он не отображает кириллицу, если изменить на <?xml version="1.0" encoding="UTF-8"?>
то он пишет Bad xml structure. Root element must be document. Как быть?
← →
RWolf ©
(2011-03-14 10:03)
[1]
приведите текст проблемного XML.
← →
smart
(2011-03-14 10:12)
[2]
> приведите текст проблемного XML.
<?xml version="1.0" encoding="windows-1251"?>
<document>
<function name="catalogCreate">
<param name="login">logg</param>
<param name="pass">password</param>
<param name="idemployer">1</param>
<param name="name"><![CDATA[Новый справочик]]></param>
<param name="iddepartment">1000</param>
</function>
<client name="SomeProgram" version="1.0"/>
</document>
← →
Медвежонок Пятачок ©
(2011-03-14 10:22)
[3]
он не отображает кириллицу
Кто он?
http://www.dropmocks.com/mSbE1
← →
RWolf ©
(2011-03-14 10:42)
[4]
http://clip2net.com/s/PhXX
всё прекрасно отображается.
← →
smart
(2011-03-14 10:57)
[5]
Этот xml создает новый каталог, и название этого каталога «Новый справочник» отображается так: Р’РёРґ Поступления. Как это исправить?
← →
RWolf ©
(2011-03-14 11:01)
[6]
ну так кодировка файла должна соответствовать заявленной.
если написано в шапке «windows-1251», то и сохранять в windows-1251, а не в UTF-8.
← →
smart
(2011-03-14 11:03)
[7]
в том то и дело, что windows-1251 не отображает кириллицу
← →
RWolf ©
(2011-03-14 11:05)
[8]
> smart (14.03.11 11:03) [7]
в [3] наглядно показано, что отображает.
← →
Медвежонок Пятачок ©
(2011-03-14 11:05)
[9]
надо монитор поменять.
← →
Медвежонок ХМЛ ©
(2011-03-14 11:06)
[10]
он у тебя не русифицирован.
← →
clickmaker ©
(2011-03-14 11:06)
[11]
> Этот xml создает новый каталог
сам xml не может ничего создавать
← →
smart
(2011-03-14 11:07)
[12]
Удалено модератором
← →
Медвежонок ХМЛ ©
(2011-03-14 11:07)
[13]
у него монитор с функцией создания каталогов. но не русифицирован.
← →
Anatoly Podgoretsky ©
(2011-03-14 11:09)
[14]
> smart (14.03.11 10:57) [5]
Зачем тогда говорил, что «xml не отображает кириллицу», вводил в заблуждение.
← →
Anatoly Podgoretsky ©
(2011-03-14 11:10)
[15]
> smart (14.03.2011 11:03:07) [7]
Чего опять не отображает, ты бы уж определился, а то скучно становится.
← →
Anatoly Podgoretsky ©
(2011-03-14 11:11)
[16]
> Медвежонок ХМЛ (14.03.2011 11:07:13) [13]
Русифицирован, а не UTFфицирован
← →
clickmaker ©
(2011-03-14 11:12)
[17]
> монитор с функцией создания каталогов. но не русифицирован
ну, если еще на гарантии, то можно поменять, наверно. Или прошивку скачать
← →
smart
(2011-03-14 11:12)
[18]
Удалено модератором
← →
Anatoly Podgoretsky ©
(2011-03-14 11:15)
[19]
Ты уже три раза это повторил, а мы и в первый раз хорошо слышали.
← →
smart
(2011-03-14 11:16)
[20]
Как это исправить?
← →
Игорь Шевченко ©
(2011-03-14 11:17)
[21]
А как XML относится к каталогу ?
← →
Медвежонок ХМЛ ©
(2011-03-14 11:17)
[22]
Как это исправить?
не доставать имя каталога как подстроку внутри [] из файла, который реально в утф-8
← →
smart
(2011-03-14 11:28)
[23]
> не доставать имя каталога как подстроку внутри [] из файла,
> который реально в утф-8
Можно по-подробней?
← →
Плохиш ©
(2011-03-14 11:30)
[24]
> smart (14.03.11 11:16) [20]
>
> Как это исправить?
>
Надо исправить ошибки в твоей программе.
← →
Медвежонок ХМЛ ©
(2011-03-14 11:36)
[25]
Можно по-подробней?
Не можно, а нужно. Выкладывай подробности.
← →
smart
(2011-03-14 11:42)
[26]
В дельфи использую function catalogCreate
и так stringstream.WriteString("input_xml=<?xml version="1.0" encoding="windows-1251"?>")
… stringstream.WriteString("</document>");
создаю новый каталог. Новый каталог создается, только название его «непонятное». Если вместо названия каталога «Новый справочник» использовать латиницу — то все ок, но мне нужно чтобы название было на русском языке
← →
Медвежонок ХМЛ ©
(2011-03-14 11:43)
[27]
не доставать имя каталога как подстроку внутри [] из файла, который реально в утф-8
← →
smart
(2011-03-14 11:47)
[28]
То есть просто <param name="name"><Новый справочик></param>
?
← →
clickmaker ©
(2011-03-14 11:49)
[29]
содержимое узла не надо в <> закрывать
← →
smart
(2011-03-14 11:53)
[30]
Так он Bad xml structure. Root element must be document пишет
← →
Медвежонок ХМЛ ©
(2011-03-14 11:54)
[31]
Потому что «Он» — умный. Он все правильно пишет.
← →
smart
(2011-03-14 11:59)
[32]
Он-то умный. Это я просто недоконца изучил xml. Пока. Вот и прошу Вас помочь…
← →
Плохиш ©
(2011-03-14 12:02)
[33]
Надо использовать в программе WideString.
← →
Медвежонок Пятачок ©
(2011-03-14 12:03)
[34]
лучше не надо
← →
smart
(2011-03-14 12:26)
[35]
> содержимое узла не надо в <> закрывать
Полюбому иероглифы выходят (((
← →
smart
(2011-03-14 12:44)
[36]
Кто знает, помогите плз. Оч надо
← →
clickmaker ©
(2011-03-14 12:48)
[37]
> Кто знает
«Он» знает
← →
Anatoly Podgoretsky ©
(2011-03-14 12:54)
[38]
> smart (14.03.2011 12:26:35) [35]
А может там по близости есть программисты?
← →
sniknik ©
(2011-03-14 12:55)
[39]
> Кто знает
чуда ждешь? сказали же «ошибки в твоей программе.», и кто ее здесь знает?
Медвежонок ХМЛ © (14.03.11 11:36) [25]
> Можно по-подробней?
> Не можно, а нужно. Выкладывай подробности.
← →
smart
(2011-03-14 13:04)
[40]
Вот:begin
stringstream:=TStringStream.Create("");
stringstream2:=TStringStream.Create("");
try
stringstream.WriteString("input_xml=<?xml version="1.0" encoding="windows-1251"?>");
stringstream.WriteString("<document>");
stringstream.WriteString("<function name="catalogCreate">");
stringstream.WriteString("<param name="login">logg</param>");
stringstream.WriteString("<param name="pass">password</param>");
stringstream.WriteString("<param name="idEmployer">1</param>");
stringstream.WriteString("</function>");
stringstream.WriteString("<client name="SomeProgram" version="1.0"/>");
stringstream.WriteString("</document>");
IdHTTP1.Request.ContentType:="application/x-www-form-urlencoded";
IdHTTP1.Request.ContentLength:=stringstream.Size;
stringstream.Position:=0;
stringstream2.WriteString(Form1.IdHTTP1.Post("http://888.888.888.888/api/functions.php", stringstream));
Form1.IdHTTP1.Disconnect;
Form1.XMLDocument1.LoadFromStream(stringstream2);
Form1.XMLDocument1.Active:=true;
Form1.XMLDocument1.SaveToFile("c:expl.xml");
finally
stringstream.Free;
end;
← →
smart
(2011-03-14 13:05)
[41]
С поправкой:begin
stringstream:=TStringStream.Create("");
stringstream2:=TStringStream.Create("");
try
stringstream.WriteString("input_xml=<?xml version="1.0" encoding="windows-1251"?>");
stringstream.WriteString("<document>");
stringstream.WriteString("<function name="catalogCreate">");
stringstream.WriteString("<param name="login">logg</param>");
stringstream.WriteString("<param name="pass">password</param>");
stringstream.WriteString("<param name="idEmployer">1</param>");
stringstream.WriteString("<param name="name"><![CDATA[Новый справочик]]></param>");
stringstream.WriteString("</function>");
stringstream.WriteString("<client name="SomeProgram" version="1.0"/>");
stringstream.WriteString("</document>");
IdHTTP1.Request.ContentType:="application/x-www-form-urlencoded";
IdHTTP1.Request.ContentLength:=stringstream.Size;
stringstream.Position:=0;
stringstream2.WriteString(Form1.IdHTTP1.Post("http://888.888.888.888/api/functions.php", stringstream));
Form1.IdHTTP1.Disconnect;
Form1.XMLDocument1.LoadFromStream(stringstream2);
Form1.XMLDocument1.Active:=true;
Form1.XMLDocument1.SaveToFile("c:expl.xml");
finally
stringstream.Free;
end;
← →
Медвежонок Пятачок ©
(2011-03-14 13:15)
[42]
Form1.IdHTTP1.Post(«http://888.888.888.888/api/functions.php», stringstream);
ShowMessage(stringstream.string);
Вот твои крякозябры.
И как видишь, никакой xml здесь не использовался, и не мешал русскому наименованию папки.
← →
Медвежонок ХМЛ ©
(2011-03-14 13:17)
[43]
Точнее даже так
ShowMessage(Form1.IdHTTP1.Post(«http://888.888.888.888/api/functions.php», stringstream));
← →
smart
(2011-03-14 13:25)
[44]
Ошибка. в названиях каталога те же иероглифы…
← →
Медвежонок ХМЛ ©
(2011-03-14 13:26)
[45]
Все, я пас……
Медицина бессильна
← →
Плохиш ©
(2011-03-14 13:52)
[46]
> smart (14.03.11 13:04) [40]
Какое отношение всё это <…> имеет к xml и созданию каталогов?
← →
smart
(2011-03-14 13:55)
[47]
С помощью этого кода создается каталог. <function name="catalogCreate">
— Создать новый каталог
← →
Плохиш ©
(2011-03-14 14:02)
[48]
Пора нанимать программиста.
← →
brother ©
(2011-03-15 06:07)
[49]
smart
ты понял к чему тебе предлагают нанять программиста?
← →
smart
(2011-03-15 08:56)
[50]
> Form1.IdHTTP1.Post(«http://888.888.888.888/api/functions.
> php», stringstream);
> ShowMessage(stringstream.string);
>
> Вот твои крякозябры.
>
> И как видишь, никакой xml здесь не использовался, и не мешал
> русскому наименованию папки.
Проблемы у меня IdHTTP1.Post-кодировкой. Вместо Utf нужно использовать windows-1251, проблема кажется в этом. Как с этим разобраться?
← →
sniknik ©
(2011-03-15 09:26)
[51]
> Вместо Utf нужно использовать windows-1251
это тебя «осенило», или наконец то прочел ответы в ветке?
на самом деле windows-1251 единственное где нужно это в виндовой функции создания каталога (если не юникодная), а в Post, xml, … вполне пойдет любая.
лирика.
> Как с этим разобраться?
учиться учится и еще раз учиться! (как расписывал ручку тов.Ленин)
p.s. все больше и больше смахивает на попытку «развода» (ну не бывает настолько ….).
← →
smart
(2011-03-15 09:56)
[52]
И времени и желания нет и не было «на развод». Просто нужна помощь (((
← →
RWolf ©
(2011-03-15 11:06)
[53]
> Как с этим разобраться?
отладчиком.
пошаговым выполнением алгоритма, с просмотром всех переменных.
← →
smart
(2011-03-15 11:14)
[54]
Отладчиком пользовался, все просмотрел. В программе все нормально, кроме кодировки.
Я думаю что проблема в этой строке, но где именно пока непонятно…
> stringstream2.WriteString(Form1.IdHTTP1.Post(«http://888.
> 888.888.888/api/functions.php», stringstream));
← →
Dennis I. Komarov ©
(2011-03-15 11:30)
[55]
> Я думаю что проблема в этой строке
Да нет, проблема совсем в другом месте…
← →
smart
(2011-03-15 11:33)
[56]
> Да нет, проблема совсем в другом месте…
>
Где же?
← →
brother ©
(2011-03-15 11:38)
[57]
у тебя в коде вестимо
← →
Медвежонок Пятачок ©
(2011-03-15 11:45)
[58]
в [41] ошибок нет, хотя код и еретический.
ошибка дальше, в неприведенном здесь коде.
← →
DiamondShark ©
(2011-03-15 11:45)
[59]
> smart (15.03.11 11:33) [56]
> > Да нет, проблема совсем в другом месте…> Где же?
В реализации http://888.888.888.888/api/functions.php
← →
Dennis I. Komarov ©
(2011-03-15 11:47)
[60]
> brother © (15.03.11 11:38) [57]
вообще, я не это имел ввиду…
← →
Медвежонок ХМЛ ©
(2011-03-15 11:53)
[61]
с полученным из пхп ответом надо работать как с xml, а не юзать стрингстрим вырезая имя каталога позами и копями.
Вот и вся недолга.
← →
smart
(2011-03-15 12:11)
[62]
> ошибка дальше, в неприведенном здесь коде.
Вот листинг:
function TForm1.catalogCreate(Login: string;Password1: string): string;
var
stringstream: TStringStream;
stringstream2: TStringStream;
begin
stringstream:=TStringStream.Create("");
stringstream2:=TStringStream.Create("");
try
stringstream.WriteString("input_xml=<?xml version="1.0" encoding="windows-1251"?>");
stringstream.WriteString("<document>");
stringstream.WriteString("<function name="catalogCreate">");
stringstream.WriteString("<param name="login">logg</param>");
stringstream.WriteString("<param name="pass">password</param>");
stringstream.WriteString("<param name="idEmployer">1</param>");
stringstream.WriteString("<param name="name">Новый справочик></param>");
stringstream.WriteString("</function>");
stringstream.WriteString("<client name="SomeProgram" version="1.0"/>");
stringstream.WriteString("</document>");
IdHTTP1.Request.ContentType:="application/x-www-form-urlencoded";
IdHTTP1.Request.ContentLength:=stringstream.Size;
stringstream.Position:=0;
ShowMessage(Form1.IdHTTP1.Post("http://"888.888.888"/api/functions.php", stringstream));
Form1.IdHTTP1.Disconnect;
Form1.XMLDocument1.LoadFromStream(stringstream2);
Form1.XMLDocument1.Active:=true;
Form1.XMLDocument1.SaveToFile("c:expl.xml");
finally
stringstream.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
t: String;
begin
t:= MD5DigestToStr(MD5String(Password.Text));
IdEmpl1.Text:= catalogCreate(Login.Text,t);
end;
Попробовал так, но результата пока нет…
← →
Медвежонок Пятачок ©
(2011-03-15 12:19)
[63]
ты запарил уже своей непробиваемостью.
вот пришел к тебе ответ и ты его сохранил.
и в нем имя папки.
Form1.XMLDocument1.SaveToFile(«c:expl.xml»);
где ты его читаешь?
имя для создаваемой папки где и как читаешь?
← →
smart
(2011-03-15 12:31)
[64]
Новый каталог создается в другой — параллельной программе. Там и весь список папок. Только в название нового каталога сейчас там Новый справочник
← →
brother ©
(2011-03-15 12:34)
[65]
ты точно — НЕ ПРОБИВАЕМЫЙ!!!!
← →
brother ©
(2011-03-15 12:36)
[66]
> вот пришел к тебе ответ и ты его сохранил.
и скорее всего уже битый…
← →
Медвежонок ХМЛ ©
(2011-03-15 12:37)
[67]
Новый каталог создается в другой — параллельной программе.
Тогда спи спокойно.
У тебя ошибок нету.
← →
brother ©
(2011-03-15 12:40)
[68]
> Form1.XMLDocument1.LoadFromStream(stringstream2);
> Form1.XMLDocument1.Active:=true;
> Form1.XMLDocument1.SaveToFile(«c:expl.xml»);
где его заполнение/чтение?
← →
Медвежонок ХМЛ ©
(2011-03-15 12:48)
[69]
это делается в третьей перпендикулярной программе.
разве не понятно?
← →
brother ©
(2011-03-15 12:49)
[70]
гыгы, я догадывался)
← →
Плохиш ©
(2011-03-15 12:52)
[71]
Судя по тому, что это блондинко засовывает в TStringStream, в /api/functions.php реализован обычный веб-сервис. Так почему бы не создать нормального клиента с помощью встроенного в делфи мастера?
PS. Долго ещё оно будет бодаться, используя комбинируя компоненты поддерживающие юникод и не поддерживающие :-))
← →
Dennis I. Komarov ©
(2011-03-15 12:56)
[72]
Да пусть бодается, если brain.sys встал криво…
← →
sniknik ©
(2011-03-15 13:18)
[73]
> с полученным из пхп ответом надо работать как с xml
х.м. … у меня бывает от пхп рекордсеты(/json) приходят, или бинарные данные (например иконки/логотип компании), по протоколу/договоренности… (и кстати .php в конце может и не быть признаком обработчик пхп. как «ту сторону» реализуют я часто не знаю, а вот общие части протокола, со вполне определенными ссылками/функциями для всех одинаковы… эээ… в определенных пределах. стремимся к этому, это точно)
я к тому, уточнение, что «работать как с xml» надо только если пришел xml, что в данном случае не очевидно (и вряд ли будет с его «подходом»).
← →
smart
(2011-03-15 13:26)
[74]
> «работать как с xml» надо только если пришел xml, что в
> данном случае не очевидно
Собственно xml: <?xml version="1.0" encoding="windows-1251" ?>
- <document>
- <info>
<api_version>1.0</api_version>
<time>10:11:15</time>
<execution_time>0.24351406097412</execution_time>
</info>
- <result value="0">
<id>120</id>
<message>120</message>
</result>
</document>
← →
Anatoly Podgoretsky ©
(2011-03-15 13:28)
[75]
> brother (15.03.2011 12:36:06) [66]
Не битый, а избитый, но не до конца.
← →
app ©
(2011-03-15 13:30)
[76]
Надоело, потрепаться можно и в Прочем
← →
Медвежонок Пятачок ©
(2011-03-15 13:31)
[77]
Мужик, тебе же сказали, покойся с миром, у тебя нет ошибок.
Их допустил программист второй, параллельной программы.
А ты иди в кассу за премией.
← →
sniknik ©
(2011-03-15 14:08)
[78]
> Собственно xml:
все таки xml… а чего же тогда xml в xml как есть с заголовком вкладывается? оно что должно телепатически правильно «сложить» document-ы?
← →
Медвежонок Пятачок ©
(2011-03-15 14:18)
[79]
и главное где же в нем хоть намек на имя каталога?
← →
Conflict ©
(2011-03-15 14:35)
[80]
оффтоп
А на самом деле в заголовок попадает кракозябла из [5] вот какая, а не Новый справочник:
Р’РёРґ ПоступленияCP1251 → UTF-8
Вид Поступления
/оффтоп
← →
sniknik ©
(2011-03-15 17:21)
[81]
http://delphimaster.net/view/2-1298888893/
http://delphimaster.net/view/2-1298888893/
(пора банить за смену ника
http://delphisources.ru/forum/showthread.php?t=15743
← →
Inovet ©
(2011-03-15 17:58)
[82]
> [81] sniknik © (15.03.11 17:21)
> (пора банить за смену ника
Да я сразу те ветки вспомнил. Месяц уже бьётся над справочниками. По-моему какое-то глухое непонимание даже не того, как сделать, а что надо сделать.
← →
boriskb ©
(2011-03-15 18:42)
[83]
> По-моему какое-то глухое непонимание…
что надо учиться.
← →
gonzales
(2011-03-19 23:39)
[84]
переконверти просто строку из UTF-8 в ASCII, вот например функция.
function TForm1.UTF8ToStrSmart(Value: String): String;
{Convert string from UTF-8 format mixed with standart ASCII symbols($00..$7f)}
var
Digit: String;
i: Word;
HByte: Byte;
Len: Byte;
begin
Result := "";
Len := 0;
if Value = "" then Exit;
for i := 1 to Length(Value) do
begin
if Len > 0 then
begin
Digit := Digit + Value[i];
Dec(Len);
if Len = 0 then
Result := Result + UTF8ToStr(Digit);
end else
begin
HByte := Ord(Value[i]);
if HByte in [$00..$7f] then //Standart ASCII chars
Result := Result + Value[i]
else begin
//Get length of UTF-8 char
if HByte and $FC = $FC then
Len := 6
else if HByte and $F8 = $F8 then
Len := 5
else if HByte and $F0 = $F0 then
Len := 4
else if HByte and $E0 = $E0 then
Len := 3
else if HByte and $C0 = $C0 then
Len := 2
else begin
Result := Result + Value[i];
Continue;
end;
Dec(Len);
Digit := Value[i];
end;
end;
end;
end;
а вам, уважаемые стыдно должно быть, не можете парню помочь, просто жлобы какие-то собрались. Вообще чувак, не ходи сюда, есть другие ресурсы и люди там адекватные.
← →
gonzales
(2011-03-19 23:44)
[85]
да, чуть не забыл, вот еще функция function TForm1.UTF8ToStr(Value: String): String;
{Convert string from UTF-8 format into ASCII}
var
buffer: Pointer;
BufLen: LongWord;
begin
BufLen := Length(Value) + 4;
GetMem(buffer, BufLen);
FillChar(buffer^, BufLen, 0);
MultiByteToWideChar(CP_UTF8, 0, @Value[1], BufLen - 4, buffer, BufLen);
Result := WideCharToString(buffer);
FreeMem(buffer, BufLen);
end;
используем
s:=form1.UTF8ToStrSmart(s1);
← →
Игорь Шевченко ©
(2011-03-20 00:33)
[86]
> а вам, уважаемые стыдно должно быть
Чувство долга есть у каждого, но одним вечно кажется,
что они что-то должны, а другие уверены, что должны им
← →
sniknik ©
(2011-03-20 11:18)
[87]
> есть другие ресурсы и люди там адекватные.
сходи уж тогда по третьей ссылке из sniknik © (15.03.11 17:21) [81], и там тоже «постыди» «адекватных» людей которые перестали ему помогать… когда тоже самое пошло «на второй круг». (у нас это пошло раньше, в первых ссылках этого поста)
да, и кстати, твои выложенные процедуры, это тоже не помощь, это медвежья услуга, при применении без понимания. у него же xml, а это значит пофигу в какой оно кодировке внутри, если в его заголовке указана правильная.
к тому же в дельфе есть стандартные процедуры перекодировщики.
блин, потом и рождаются «монстры», указано одно, содержание другое, внутри данных не перекодированные теги, указан внешний парсер/»проверяльщик» (который существует только на машине клиента), и т.д. с которыми мне постоянно приходится иметь дело…