Имя: Пароль:
1C
1С v8
Как правильно читать из файла 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 &amp; 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
>это турки сделали

янычарам http://www.w3.org/XML - не указ? О_о

пускай переделывают свою каку
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
Я за дебилами, например амперсанды заменял на &amp; , но это к делу не относится.
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) Огласите!
AdBlock убивает бесплатный контент. 1Сергей