Имя: Пароль:
1C
1С v8
разбор хмл
0 MiniMuk
 
16.04.14
10:27
Есть ответ от веб-сервиса в виде хмл примерно такого вида

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">;
  <soap:Body>
    <GetLibraryResponse xmlns="http://beeline.ru/ws/dol/2006">;
      <LIBRARY Version="" Code="BILLPLANS">
        <ITEM>
          <RowBillPlan Code="06CFSU300" SOC="06CFSU300" Accept="1" Enable="1"/>
          <RowBillPlan Code ...

Как и чем правильно воспользоваться чтобы найти нужную мне строку(строки) например по атрибуту  SOC

Вроде есть XPath (XPath), подскажите как правильно воспользоваться по СП не могу понят, не хочеться использовать поузловое чтение
1 Maxus43
 
16.04.14
10:28
без "поузлового" чтения - надо схему xml этого файла
2 MiniMuk
 
16.04.14
10:57
(1) у меня в описании функции, ответ на запрос выглядит так, правильно ли я понимаю что это является схемой ответа?

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">;
  <soap:Body>
    <GetLibraryResponse xmlns="http://beeline.ru/ws/dol/2006">;
      <LIBRARY Code="string" Version="string">
        <ITEM>
          <RowBPlanService BillPlansId="int" ServicesId="int" Mandatory="int" />
          <RowIdNameCode Code="string" />
        </ITEM>
      </LIBRARY>
    </GetLibraryResponse>
  </soap:Body>
3 spectre1978
 
16.04.14
11:00
Вот здесь Семерка работает с любым msxml парсером, или нужен конкретный номер?
я сбрасывал пример работы с DOM/XPath. Вообще если погуглить, то примеры в сети находятся, немного, но есть
4 MiniMuk
 
16.04.14
11:02
(3) Спасибо, пойду почитаю
5 MiniMuk
 
16.04.14
11:03
Начал разбираться с хмл, просто плаваю еще в понятиях
6 Maxus43
 
16.04.14
11:04
(2) это не схема, почитай ещё про схему xml, она типа так выглядит

    <xs:complexType name="Элемент.Док">
        <xs:sequence>
            <xs:element name="Ref" type="tns:AnyRef"/>
            <xs:element name="Code">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:length value="9"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="Description">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="100"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
7 Александр_
Тверь
 
16.04.14
11:06
Попробуй через ОбъектXDTO.
Читаешь XML в него, а потом по нему бегаешь и ищешь что тебе нужно.

Примерно вот так:

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяВыходногоФайла);

ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
8 Maxus43
 
16.04.14
11:10
(7) без схемы не взлетит, тип неизвестен
9 MiniMuk
 
16.04.14
11:11
Поискал, в описании сервиса .../WebService/DOL.asmx?
Что-то подобное встречается, мне этот кусок надо получить отдельно или можно брать все описание, получаю описание сервиса примерно так
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2,"Windows-1251");
WinHttp.Open("get","/WebService/DOL.asmx?WSDL",0);
WinHttp.setRequestHeader("Content-Type","text/xml; charset=utf-8");
WinHttp.Send();
выглядит примерно так

<s:complexType name="Library">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="ITEM" type="tns:ArrayOfChoice1"/>
</s:sequence>
<s:attribute name="Code" type="s:string"/>
<s:attribute name="Version" type="s:string"/>
</s:complexType>
<s:complexType name="ArrayOfChoice1">
<s:choice minOccurs="0" maxOccurs="unbounded">
<s:element minOccurs="1" maxOccurs="1" name="RowLogParam" nillable="true" type="tns:RowLogParam"/>
<s:element minOccurs="1" maxOccurs="1" name="RowIdName" nillable="true" type="tns:RowIdName"/>
<s:element minOccurs="1" maxOccurs="1" name="RowScladLinkHistory" nillable="true" type="tns:RowScladLinkHistory"/>
<s:element minOccurs="1" maxOccurs="1" name="RowBPlanService" nillable="true" type="tns:RowBPlanService"/>
<s:element minOccurs="1" maxOccurs="1" name="RowBillPlan" nillable="true" type="tns:RowBillPlan"/>
<s:element minOccurs="1" maxOccurs="1" name="RowPrintForms" nillable="true" type="tns:RowPrintForms"/>
<s:element minOccurs="1" maxOccurs="1" name="RowBank" nillable="true" type="tns:RowBank"/>
<s:element minOccurs="1" maxOccurs="1" name="RowIdNameShortName" nillable="true" type="tns:RowIdNameShortName"/>
<s:element minOccurs="1" maxOccurs="1" name="RowIdNameAddress" nillable="true" type="tns:RowIdNameAddress"/>
<s:element minOccurs="1" maxOccurs="1" name="RowScladLink" nillable="true" type="tns:RowScladLink"/>
<s:element minOccurs="1" maxOccurs="1" name="RowProduct" nillable="true" type="tns:RowProduct"/>
<s:element minOccurs="1" maxOccurs="1" name="RowCountry" nillable="true" type="tns:RowCountry"/>
<s:element minOccurs="1" maxOccurs="1" name="RowIdNameCode" nillable="true" type="tns:RowIdNameCode"/>
</s:choice>
</s:complexType>
10 Maxus43
 
16.04.14
11:13
(9) вот это схема уже
11 Maxus43
 
16.04.14
11:13
попробуй в конфигураторе всю схему загрузить в пакет XDTO, там же можно проверит схему на ошибки
12 MiniMuk
 
16.04.14
11:15
Мне надо эту схему скормить ФабрикаXDTO а потом пробовать читать?
13 Maxus43
 
16.04.14
11:18
(11) если схема правильная см (11), то да. в СП там написаны варианты чтения XML по схеме
14 MiniMuk
 
16.04.14
11:25
1с не распознет всю схему, пишет фатальная ошибка разбора
15 Maxus43
 
16.04.14
11:26
(14) дело не в 1с, дело в схеме. Не правильная значит, этот формат универсален
16 MiniMuk
 
16.04.14
11:39
Описание веб сервиса (../WebService/DOL.asmx?WSDL)
и схема это вещи разные?
У (6) элементы описываются <xs:complexType name
а у меня <s:element minOccurs="1"
не совсем  понимаю это одно и тоже и они как то связаны?
Заголовов описания вебсерива такой

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"; xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"; xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"; xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"; xmlns:tns="http://beeline.ru/ws/dol/2006"; xmlns:s="http://www.w3.org/2001/XMLSchema"; xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"; xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"; xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"; targetNamespace="http://beeline.ru/ws/dol/2006">;
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://beeline.ru/ws/dol/2006">;
<s:element name="ReguestStatuses">
<s:complexType>
17 Александр_
Тверь
 
16.04.14
11:42
(8) с чего это?
Я так читаю совершенно неизвестные XML файлы без всякой схемы.
18 Александр_
Тверь
 
16.04.14
11:43
(12) скажу еще раз.
Лично работаю по варианту из (7). Без всяких схем и т.д.
Просто пробегаюсь по объектXDTO и выбираю нужные мне данные.
19 MiniMuk
 
16.04.14
11:45
(18) Можно поинтересоваться, как
20 Maxus43
 
16.04.14
11:50
(17) без схемы только с примитивными типами ЕМНИП, сложные типы описаны только в схеме...
(19) ну попробуй как в (7)
21 Александр_
Тверь
 
16.04.14
11:52
(19) ну именно как в (7) написано.

Посылаю запрос на сервер (левый, не 1С). Он мне возвращает XML.

Я его загружаю как в (7) описано. Потом пробегаюсь по объекту и выбираю нужные мне данные (не объектные, конечно).
22 Александр_
Тверь
 
16.04.14
11:53
В любом случае это на много удобнее чем как-то "ручками" парсить.
23 Maxus43
 
16.04.14
11:53
судя по (0) - там описана таб часть, это уже не простой тип, и без схемы непонятно как его обходить. В лучшем случае будет просто аналогично тупому перебору узлов, чего автор и хотел избежать
24 MiniMuk
 
16.04.14
12:02
(23) Угу, у меня есть несколько справочников, связка серийного номер с тарифным планом (оператор связи) связь тарифного плана с услугами, связь сериника   с телефонным номером, надо все это в кучу собрать. Вот думаю как под каждый справочник свой перебор не писать
25 MiniMuk
 
16.04.14
12:03
Всем спасибо, поду вникать в то что насоветовали
26 Maxus43
 
16.04.14
12:05
(25) посомтри в сторону сторонних программ, есть мелкие бесплатные проги, позволяющие например по образцу файла XML сделать его схему (но опять же там ограничение есть, с хитрыми типами не сможет совладать, самому надо описывать).
Ну и (7) для очистки совести без схем всяких - тоже
27 MiniMuk
 
18.04.14
08:24
Загрузил я свой справочник, инетесно, поиск по нему есть?
http://s1.ipicture.ru/uploads/20140418/PT5oF190.png
28 MiniMuk
 
18.04.14
08:27
Даже загрузил типы по описанию сервиса
ФабрикаXDTO.Тип(ОписаниеСервиса.xml,"RowScladLink");

Где в описании вебсервиса строка справочник так расписана
<s:complexType name="RowScladLink">
<s:complexContent mixed="false">
<s:extension base="tns:LibRow">
<s:attribute name="SNB" type="s:string"/>
<s:attribute name="Type" type="tns:LinkType" use="required"/>
<s:attribute name="SerNum" type="s:string"/>
<s:attribute name="SOC" type="s:string"/>
<s:attribute name="HLR" type="s:string"/>
<s:attribute name="RegionCode" type="s:string"/>
</s:extension>
</s:complexContent>
</s:complexType>