|
Как правильно читать из файла XML с с несколькими корневыми элементами | ☑ | ||
---|---|---|---|---|
0
shavkat
03.02.15
✎
17:02
|
Добрый день
Есть файл XML с тремя корневыми элементами. Как прочитать такой файл при помощи DOM? Этот код дает ошибку: {ВнешняяОбработка.ЗагрузитьРеализацииИзXML.МодульОбъекта(13)}: Ошибка при вызове метода контекста (Прочитать) ДокументДОМ=ПостроительДОМ.Прочитать(Чтение); по причине: Ошибка разбора XML: - [28,1] Фатальная ошибка: Extra content at the end of the document SystemId: file://C:/Users/user/Desktop/INVOICE (1).XML вот текст XML <?xml version="1.0" encoding="ISO-8859-9" ?> <MUSTERILER> <MUSTERI> <KODU>0002230</KODU> <KODU2>0002230</KODU2> <MERKEZKODU>0002230</MERKEZKODU> <ADI>"Меъроч"</ADI> <IL>Dushanbe</IL> <ILCE>Dushanbe Center</ILCE> <ADRESI>50 солаги 55</ADRESI> <TIPKODU>116</TIPKODU> <TIPADI>MOM & POP</TIPADI> <KANALKODU>039</KANALKODU> </MUSTERI> </MUSTERILER> <URUNLER> <URUN> <KODU>101900</KODU> <ADI>КОКА-КОЛА 1.0 Л</ADI> <KDV>0</KDV> <TIPI>1</TIPI> <AGIRLIK>12500</AGIRLIK> <HACIM>1,43</HACIM> </URUN> </URUNLER> <FISLER> <FIS> <FISTIPI>SATIS</FISTIPI> <FISID>71162690669</FISID> <FISNO>8567</FISNO> <IPTAL>0</IPTAL> <TARIH>01.02.2015</TARIH> <MUSKODU>0002230</MUSKODU> <MUSADI>"Меъроч"</MUSADI> <VERGIDAIRESI>TaxOffice</VERGIDAIRESI> <TOPLAMBRUT>555.6</TOPLAMBRUT> <KALEMLER> <KALEM> <KALEMNO>1</KALEMNO> <URUNKODU>103500</URUNKODU> <URUNADI>КОКА-КОЛА 1.5 Л</URUNADI> <MIKTAR>2</MIKTAR> <BIRIMFIYAT>27</BIRIMFIYAT> </KALEM> </KALEMLER> </FIS> </FISLER> |
|||
1
bolero
03.02.15
✎
17:04
|
корневой элемент может быть только один, ПостроительДОМ по делу ругается
выйти из ситуации можно, убрав текстовыми функциями декларацию xml, и обернуть это все хозяйство в <fake_root></fake_root> с новой декларацией <?xml |
|||
2
ShoGUN
03.02.15
✎
17:06
|
(0) Никак. Это не валидный XML, и ни один нормальный парсер его читать не будет, по спецификации корневой элемент только один. Если переделать файл как (1) говорит - то читаться будет.
|
|||
3
bolero
03.02.15
✎
17:08
|
+ кодировка очень странная, вангую следующий вопрос про нее
|
|||
4
shavkat
03.02.15
✎
17:11
|
(3) это турки сделали
|
|||
5
shavkat
03.02.15
✎
17:14
|
ЧтениеXML прочитывает этот файл, плохо что там нет структуры.
или можно как нить получить структуру из ЧтениеXML? |
|||
6
Господин ПЖ
03.02.15
✎
17:15
|
>Есть файл XML с тремя корневыми элементами.
такого файла быть не может по определению |
|||
7
su_mai
03.02.15
✎
17:16
|
(0) Включи все в еще один свой корневой узел "root"
|
|||
8
ShoGUN
03.02.15
✎
17:18
|
(5) Зови Суворова и бей турок.
ЧтениеXML - последовательный парсер, который не загружает весь документ. А DOM-парсер работать не будет без (7). |
|||
9
Господин ПЖ
03.02.15
✎
17:23
|
||||
10
shavkat
03.02.15
✎
17:31
|
(1)(7) спасибо за дельные советы, так работает.
|
|||
11
su_mai
03.02.15
✎
17:31
|
(8) Проверь сам:
Чтение = Новый ЧтениеXML(); Чтение.УстановитьСтроку(ТекстXML); ЧтениеДом = Новый ПостроительDOM(); Дом = ЧтениеДом.Прочитать(Чтение); |
|||
12
ShoGUN
03.02.15
✎
17:33
|
(11) Ещё раз - ЧтениеXML не загружает весь документ, поэтому может работать на невалидных документах. Ему пофиг на структру документа в целом. А DOM с таким файлом работать не будет. Как исправить - тебе сказали.
|
|||
13
su_mai
03.02.15
✎
17:33
|
(10) Всегда пожалуйста. Хотя конечно (9) прав. Переделывая их файл ты берешь на себя ответственность за данные, а это головная боль "туркав".
|
|||
14
igork1966
03.02.15
✎
17:34
|
(0) изготовителей нового стандарта xml бить больно...
|
|||
15
su_mai
03.02.15
✎
17:35
|
(12) Ты говоришь о чем то общем, а в контексте данного вопроса "как прочитать с помощью DOM" (11) вариант как "выкрутиться".
|
|||
16
ShoGUN
03.02.15
✎
17:38
|
(15) И чо? Сегодня работает, завтра 1С перепишет всё в строгом соответствии со спецификацией - и перестанет.
|
|||
17
igork1966
03.02.15
✎
17:40
|
Предлагаю такой файл на собеседовании при приеме на работу показывать, кто не пошлет, того послать. ;-)
|
|||
18
su_mai
03.02.15
✎
17:41
|
(16) Ишо, завтра турки все перепишут в соответствии со спецификацией, или укры нас завоюют, и шо тахда? :)
|
|||
19
ShoGUN
03.02.15
✎
17:43
|
(17) Во-во.
(18) Правильный ответ "как сделать" - "сделать нормальный XML", а неправильный - "использовать костыль, который я тут нашёл". |
|||
20
shavkat
03.02.15
✎
17:43
|
(15) ты прав, следующий раз буду точнее
|
|||
21
igork1966
03.02.15
✎
17:45
|
(19) + костыль можно допустить для однократного решения задачи после которой код на свалку
|
|||
22
su_mai
03.02.15
✎
17:45
|
(17) (20) Предлагаю если на собеседовании такие "размытые вопросы" задают и потом пальцы гнут того послать.
может задача разовая, из вопроса не понятно |
|||
23
su_mai
03.02.15
✎
17:47
|
(19) Я могу поспорить если тебе заказчик такой файл даст, а к "туркам" доступа нет, то ты именно костыль придумаешь из (8). :) Деньги не пахнут...
|
|||
24
shavkat
03.02.15
✎
17:48
|
(22) нет, задача не разовая.
Есть программка учета торговли (ее сделали турки) эта программа дает такой XML файл, из этого файла должны загрузит в УТ (создавать реализации) |
|||
25
ShoGUN
03.02.15
✎
17:48
|
(22) Задачи загрузки очень редко разовые. Плюс, модификация файла не более трудоёмкая, чем использование костыля, но заведомо рабочая, в случае, если задача повторится.
|
|||
26
ShoGUN
03.02.15
✎
17:50
|
(23) Я уже сталкивался с такой лажей, и делал валидный XML, а не выдумывал извращения. А за тобой потом кому-то дерьмо разгребать.
|
|||
27
su_mai
03.02.15
✎
17:51
|
(26) Валидный каким образом?
|
|||
28
Господин ПЖ
03.02.15
✎
17:52
|
>Есть программка учета торговли (ее сделали турки) эта программа дает такой XML файл, из этого файла должны загрузит в УТ
йопт... они не пробовали результат своей работы через любой валидатор пропустить? |
|||
29
ShoGUN
03.02.15
✎
17:53
|
(27) Ты о чём вообще?
|
|||
30
ShoGUN
03.02.15
✎
17:54
|
Я за дебилами, например амперсанды заменял на & , но это к делу не относится.
|
|||
31
Господин ПЖ
03.02.15
✎
17:54
|
(27) единственно верным
|
|||
32
su_mai
03.02.15
✎
17:57
|
(29) Блин, как файл из (0) по твоему сделать единственно верным валидным?
|
|||
33
su_mai
03.02.15
✎
17:58
|
(31) послать ответ туркам, что структура файла не соответствует спецификации .... :)
|
|||
34
ShoGUN
03.02.15
✎
18:01
|
(33) По-хорошему - да.
|
|||
35
shavkat
03.02.15
✎
18:02
|
(28) я сам над ними фигею.
И тем более, из этого файла нужен только третий корневой элемент. |
|||
36
ShoGUN
03.02.15
✎
18:02
|
+(34) Потому что его ни один парсер не откроет, и дело тут не в 1С.
|
|||
37
su_mai
03.02.15
✎
18:04
|
(36) Ответь пожалуйста на (32) вопрос :)
|
|||
38
ShoGUN
03.02.15
✎
18:05
|
Это ещё цветочки, из практики моей девушки, которая SAP-ер - у казахов есть какая-то отчётность, которая формируется следующим черезпятоточечным методом:
- Делаем XML. - Пакуем его GZIP-ом(или ZIP-ом, не помню уже). - Отрезаем сигнатуру. - Сохраняем со своим расширением. Имеем никому непонятный формат. |
|||
39
ShoGUN
03.02.15
✎
18:07
|
(37) Я не понял тебя в (11). Обернуть корневые элементы можно, это нормальный способ. Но где гарантии, что следующий файл будет соответствовать спецификации в другой части? Это - костыль.
|
|||
40
ShoGUN
03.02.15
✎
18:09
|
>это нормальный способ => это нормальный одноразовый способ
|
|||
41
su_mai
03.02.15
✎
18:11
|
(39) Согласен, что костыль. Как сказал ВВП "полную гарантию может дать только страховой полис"
(40) Полный многоразовый взять на свою поддержку турецкую программу за доп.плату, и использовать нормальный одноразовый способ :) |
|||
42
Господин ПЖ
03.02.15
✎
18:17
|
(33) по сути - да
ибо в другой программе рядом с файлом будет лежать схема для проверки (чтобы мусор не совали в поля). И файл будет просто посылаться на ... как "мусорный" |
|||
43
ShoGUN
03.02.15
✎
18:18
|
(41) >"полную гарантию может дать только страховой полис"
Да ладно? Неужто страховые не разоряются? :))) Ну да ладно, не буду оффтопить. Не надо прогибаться под тех, кто делает всё через *опу. Потому что в следующий раз это будет так глубоко через неё, что исправлению уже не поддастся. |
|||
44
su_mai
03.02.15
✎
18:25
|
(43) :)
|
|||
45
sapphire
03.02.15
✎
23:28
|
(38) да я даже знаю зачем они так делают:)
|
|||
46
ShoGUN
03.02.15
✎
23:31
|
(45) И? :)
|
|||
47
ShoGUN
03.02.15
✎
23:31
|
+(46) Огласите!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |