Имя: Пароль:
1C
1С v8
Чтение xml по схеме xsd
0 RuMIN
 
26.08.12
15:48
Добрый день! Помогите разобраться с механизмом XDTO! Читаю, читаю, никак не могу вкурить!
Проблема в том что xml файл (и соотоветсвенно xsd файл) выгружен не из 1с. Из какой системы точно не знаю (если это нужно, могу узнать). Схема вот такая:

?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:od="urn:schemas-microsoft-com:officedata">
<xsd:element name="dataroot">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Стадник" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="generated" type="xsd:dateTime"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="Стадник">
<xsd:annotation>
<xsd:appinfo/>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="НомерДела" minOccurs="0" od:jetType="longinteger" od:sqlSType="int" type="xsd:int"/>
<xsd:element name="Специальность" minOccurs="0" od:jetType="text" od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="5"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="НомерПриказа" minOccurs="0" od:jetType="integer" od:sqlSType="smallint" type="xsd:short"/>
<xsd:element name="ЛьготаПриПрочихРавных" minOccurs="1" od:jetType="yesno" od:sqlSType="bit" od:nonNullable="yes" type="xsd:boolean"/>
<xsd:element name="РЯЕГЭ100" minOccurs="0" od:jetType="integer" od:sqlSType="smallint" type="xsd:short"/>
<xsd:element name="НуждаетсяВОбщежитии" minOccurs="1" od:jetType="yesno" od:sqlSType="bit" od:nonNullable="yes" type="xsd:boolean"/>
<xsd:element name="ОЕГЭ100" minOccurs="0" od:jetType="integer" od:sqlSType="smallint" type="xsd:short"/>
<xsd:element name="ГодЕГЭРЯ" minOccurs="0" od:jetType="longinteger" od:sqlSType="int" type="xsd:int"/>
<xsd:element name="ГодЕГЭО" minOccurs="0" od:jetType="longinteger" od:sqlSType="int" type="xsd:int"/>
<xsd:element name="ДатаДоговора" minOccurs="0" od:jetType="datetime" od:sqlSType="datetime" type="xsd:dateTime"/>
<xsd:element name="НомерДоговора" minOccurs="0" od:jetType="text" od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="150"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>

Содержание xml файла примерно такое:

<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:noNamespaceSchemaLocation="Стадник.xsd" generated="2012-08-22T15:17:45">
<Стадник>
<НомерДела>550</НомерДела>
<Специальность>ГД</Специальность>
<ДатаДоговора>2012-07-18T00:00:00</ДатаДоговора>
<НомерДоговора>550</НомерДоговора>
</Стадник>
<Стадник>
<НомерДела>589</НомерДела>
<Специальность>ТХОМ</Специальность>
<ДатаДоговора>2012-07-18T00:00:00</ДатаДоговора>
<НомерДоговора>589</НомерДоговора>
</Стадник>
</dataroot>

Полей там намноооооого больше, я урезал чутка. На основе этих данных надо создавать разные объекты конфигурации. Я хочу, например, загнать содержимое xml в таблицу значений а из неё по циклу создавать объекты.
Изначально я использовал ДокументыДом

   ЧитатьХМЛ = Новый ЧтениеXML;
   ЧитатьХМЛ.ОткрытьФайл(ИмяФайла);
   // Через построительDOM протаскиваем наш XML-файл в ДокументDOM.

   ПостроитьДУМ = Новый ПостроительDOM;
   ДокументДУМ = ПостроитьДУМ.Прочитать(ЧитатьХМЛ);
   ОчиститьСообщения();
   //Теперь наш XML-файл загружен в среду DOM и мы можем манипулировать его содержимым

   // как нашей душе угодно. Дальнейшие комментарии излишне.

   Сообщить("Версия XML: " + ДокументДУМ.ВерсияXML);
   КорневойУзел = ДокументДУМ.ПервыйДочерний;
   Сообщить("Корневой узел: "+КорневойУзел.ИмяУзла);
   УзлыКорневого = КорневойУзел.ДочерниеУзлы;
   ВсегоУзловКорневого = УзлыКорневого.Количество(); // Получаем коллекцию узлов корневого элемента
   Таблица = Новый ТаблицаЗначений;
   

   
   Сообщить("Корневой узел содержит "+ВсегоУзловКорневого+" узла(ов):");
   Для  каждого узла из УзлыКорневого Цикл
       Для Н = 0 По узла.ДочерниеУзлы.Количество() - 1 Цикл
           Имя = Таблица.Колонки.Найти(узла.ДочерниеУзлы[Н].ИмяУзла);
           Если Имя = Неопределено Тогда
               Имя = узла.ДочерниеУзлы[Н].ИмяУзла;
               Таблица.Колонки.Добавить(Имя);
           КонецЕсли;
           НовСтрока = Таблица.Добавить();
           НовСтрока.Имя = ЗначениеУзла;
           Н=Н+1;
       КонецЦикла;
     
   КонецЦикла;

Потом нашел вот такой вот пост http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=572290
Вот не могу понять, как прочитать, используя этот код, например, значение поля "НомерДела"?
1 Fragster
 
гуру
26.08.12
15:51
СП или гугл по ФабрикаXDTO
2 RuMIN
 
26.08.12
16:10
Так гуглил, и синтаксис помошник юзал, не понимаю!
3 andrewks
 
26.08.12
16:25
где код? или ты от нас его хочешь увидеть?
4 Fragster
 
гуру
26.08.12
16:52
ФайлыXSD = Новый Массив();
ФайлыXSD.Добавить("D:\Temp\adderss.xsd");
МояФабрикаXDTO = СоздатьФабрикуXDTO(ФайлыXSD);
адресТип = МояФабрикаXDTO.Тип("http://www.1c.ru/demos/products2", "КлассификаторАдреса");
5 RuMIN
 
26.08.12
16:54
ПутьСхемы = Строка("C:\stud.xsd");
   
   XML = New ЧтениеXML;
   ФайлНаДиске = New Файл(ПутьСхемы);
   Если Не ФайлНаДиске.Существует() Тогда
       Сообщить("Не найдена схема", СтатусСообщения.ОченьВажное);
       //Возврат Ложь;
   КонецЕсли;
   XML.ОткрытьФайл(ПутьСхемы);
   // Создадим документ DOM, чтобы с его помощью получить схему XML
   НовыйПостроительДом = New ПостроительDOM;
   НовыйДокументДом = НовыйПостроительДом.Прочитать(XML);
   // Получаем схему XML-документа (как объект)
   НовыйПостроительСхем = New ПостроительСхемXML;
   НоваяСхема = НовыйПостроительСхем.СоздатьСхемуXML(НовыйДокументДом);
   // Создаем набор схем XML и добавляем в него нашу схему XML
   НаборСхем = New НаборСхемXML;
   НаборСхем.Добавить(НоваяСхема);
   // На основе созданного набора схем XML создаем фабрику XDTO,
   // в параметр передаем набор схем XML
   НоваяФабрика = New ФабрикаXDTO(НаборСхем);
   // Открываем XML-документ для чтения
   XML = New ЧтениеXML;
   ФайлНаДиске = New Файл(ИмяФайла);
   Если Не ФайлНаДиске.Существует() Тогда
       Сообщить("Не найден файл", СтатусСообщения.ОченьВажное);
       //Возврат Ложь;
   КонецЕсли;
   XML.ОткрытьФайл(ИмяФайла);
   // Производим считывание всех данных XML-документа
   // используя фабрику XDTO, содержащую полученную схему XML
   Данные = НоваяФабрика.ПрочитатьXML(XML);
   Если Данные = Неопределено Тогда
       Сообщить("Неизвестный формат!", СтатусСообщения.ОченьВажное);
       //Возврат;
   КонецЕсли;
6 Fragster
 
гуру
26.08.12
16:55
(5) DOM - не нужен, загрузка схемы - в (4)
7 RuMIN
 
26.08.12
17:03
ФайлыXSD = Новый Массив();
ФайлыXSD.Добавить("C:\stud.xsd");
МояФабрикаXDTO = СоздатьФабрикуXDTO(ФайлыXSD);
адресТип  = МояФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema-instance", "НомерДела");


последняя строчка возвращает Неопределено
8 echo77
 
26.08.12
17:05
9 Fragster
 
гуру
26.08.12
17:18
(7) y'qvcg'qc erf;b ghfdbkmysq
10 Fragster
 
гуру
26.08.12
17:18
нэймспэйс укажи правильный, говорю
11 RuMIN
 
26.08.12
17:23
как я понял у меня пространство имен такое - http://www.w3.org/2001/XMLSchema

адресТип  = МояФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "НомерДела");

Тоже самое, неопределено
12 RuMIN
 
26.08.12
17:24
это я все вчера ещё пробовал, не выходит
13 RuMIN
 
26.08.12
17:28
перепробовал со всеми названиями узлов, результат один и тот же
14 RuMIN
 
26.08.12
18:10
вычислил вот этот момент

МояФабрикаXDTO.Пакеты[0].КорневыеСвойства

Там нет ни одного названия поля, не из схемы, не из xml! это нормально или нет? или там этого не должно быть?
15 Jaap Vduul
 
26.08.12
18:36
(0)
   СхемаXML = Новый СхемаXML;
   СхемаXML.РасположениеСхемы = "schema.xsd";
   
   СхемыXML = Новый НаборСхемXML;
   СхемыXML.Добавить(СхемаXML);
   
   ЧтениеXML = Новый ЧтениеXML();
   ЧтениеXML.ОткрытьФайл("data.xml");
   
   Фабрика = Новый ФабрикаXDTO(СхемыXML);
   Данные = Фабрика.ПрочитатьXML(ЧтениеXML);
   
   Сообщить("generated: " + Данные.generated);

И т.д.
16 RuMIN
 
26.08.12
18:58
ООООООО! Благослови тебя аллах, иисус и будда! То что надо!!! )))
Хотя я вчера тоже самое почти проделовал, только не догадался заглянуть в список xdto! ))) Ветку можно считать закрытой! )
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший