|
Чтение 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! ))) Ветку можно считать закрытой! ) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |