Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Раскидывание xml по таблицам с применением xsd  [new]
and761
Member

Откуда:
Сообщений: 19
Всем привет! В xml я только разбираюсь и текущий вопрос поставил меня в тупик. Задача такова - распарсить xml файл, раскидав его содержимое по таблицам. Вот пример файла. Часть вышестоящих, общих тэгов файла (типа mfh, mdc и прочее) в примере файла не привел, так как они мне реально не нужны и загвоздка именно в приведенном куске. Я понимаю, что объем примера большой, но реально не знаю, куда копать - наверное проблема типична и виной всему мое незнание.

Логика структуры файла такова - за какие-то дату-время (тэг mts) по нескольким объектам (тэг moid) собирается набор счетчиков. Названия счетчиков указываются один раз в тэгах mt, а значения их идут для каждого объекта в тэгах r. Таких вхождений с датами (mts) может быть несколько, в них приводятся разные счетчики и объекты.


<mi>
<mts>20130322233000Z</mts>
<gp>900</gp>
<mt>pm1</mt>
<mt>pm2</mt>
<mt>pm3</mt>
<mt>pm4</mt>
<mv>
<moid>object1</moid>
<r>0</r>
<r>0</r>
<r>0</r>
<r>0</r>
</mv>
<mv>
<moid>object2</moid>
<r>0</r>
<r>0</r>
<r>0</r>
<r>0</r>
</mv>
</mi>

Для его разбора использую IIS, схему сгенерировал там же, автоматически. Вот схема. Реально в ней интересен лишь средний кусок, где начинает описываться тег <mi> (обрезать ее не решился).
<?xml version="1.0"?>
<xs:schema xmlns:HTML="http://www.w3.org/TR/REC-xml" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="mdc">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" name="mfh">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="0" name="ffv" type="xs:string" />
              <xs:element minOccurs="0" name="sn" type="xs:string" />
              <xs:element minOccurs="0" name="st" />
              <xs:element minOccurs="0" name="vn" />
              <xs:element minOccurs="0" name="cbt" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="md">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="0" name="neid">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element minOccurs="0" name="neun" />
                    <xs:element minOccurs="0" name="nedn" type="xs:string" />
                    <xs:element minOccurs="0" name="nesw" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element minOccurs="0" name="mi">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element minOccurs="0" name="mts" type="xs:string" />
                    <xs:element minOccurs="0" name="gp" type="xs:unsignedShort" />
                    <xs:element minOccurs="0" maxOccurs="unbounded" name="mt" type="xs:string" />
                    <xs:element minOccurs="0" maxOccurs="unbounded" name="mv">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element minOccurs="0" name="moid" type="xs:string" />
                          <xs:element minOccurs="0" maxOccurs="unbounded" name="r" type="xs:string" />
                          <xs:element minOccurs="0" name="sf" type="xs:string" />
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element minOccurs="0" name="mff">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="0" name="ts" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>


Автоматически дял хранения распарсенных данных созданы 4 таблицы (имя таблицы : названия полей):
xml_mi : mi_Id, mts, gp, md_Id;
xml_mv : mi_Id, mv_Id, moid, sf;
xml_mt : mi_Id, mt;
xml_r : mv_Id, r;

По логике тут должна быть четкая привязка (по порядку) тэгов mt к тэгам r - первый тэг mt - это имя первого счетчика, а первый тэг r - его значение и так далее. Но в сгененированной схеме такой привязки нет, они связываются через таблицу xml_mv. Соответственно я не могу каждому счетчику четко сопоставить его значения и объект, а также время.
Что нужно изменить в схеме, чтобы получить привязку mt - r? Заранее спасибо.
26 мар 13, 17:04    [14098077]     Ответить | Цитировать Сообщить модератору
 Re: Раскидывание xml по таблицам с применением xsd  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Инструкция: 12410359
27 мар 13, 18:35    [14103729]     Ответить | Цитировать Сообщить модератору
 Re: Раскидывание xml по таблицам с применением xsd  [new]
and761
Member

Откуда:
Сообщений: 19
Спасибо, уже изучал. В документе по ссылке все просто - все данные содержатся в значениях тэгов. У меня же загвоздка не в общем алгоритме, а в реализации одной важной частности - порядковому соответствию значений разных тэгов. Нужно четко сопоставить каждому значению тэга <mt> значение каждого тэга <r> для каждого <moid>.

<mt>pm1</mt>
<mt>pm2</mt>
<mt>pm3</mt>
<mt>pm4</mt>
<mv>
<moid>object1</moid>
<r>0</r>
<r>0</r>
<r>0</r>
<r>0</r>
</mv>
<moid>object2</moid>
<r>0</r>
<r>0</r>
<r>0</r>
<r>0</r>
</mv>


То есть в итоге должна получиться табличка типа :
moid pm1 pm2 pm3 pm4
object1 0 0 0 0
object2 0 0 0 0

А сгенерированная схема не дает четкого соответствия (mt - r) и вопрос у меня именно по этой частности.
28 мар 13, 10:04    [14105557]     Ответить | Цитировать Сообщить модератору
 Re: Раскидывание xml по таблицам с применением xsd  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Ёкарный бабай, любят же люди извращаться. (не всё что можно сделать, есть правильно/эффективно)
MS изврат не любит (не только в данном случае).
28 мар 13, 23:06    [14110282]     Ответить | Цитировать Сообщить модератору
 Re: Раскидывание xml по таблицам с применением xsd  [new]
and761
Member

Откуда:
Сообщений: 19
Mnior
Ёкарный бабай, любят же люди извращаться. (не всё что можно сделать, есть правильно/эффективно)
MS изврат не любит (не только в данном случае).


Не очень понял, что вы хотели вот этим сказать. Отметиться, поспамить? Не удивляюсь, что у вас более 5 тысяч сообщений : эдак и 25 тысяч легко нащелкать.

Извращения...это Вы о чем? Есть xml файл строго определенной структуры (если интересно, он создается на оборудовании одного из мировых лидеров телекоммуникационного рынка). Наивно полагаю, что там работают далеко не первоклассники и более чем уверен, что выбор структуры файла всесторонне продуман и максимально оптимизирован под задачи загрузки.

Может, просто Вы не в курсе, как решается данная задача? Честно говоря, мне в это верится гораздо более охотно.
29 мар 13, 09:18    [14111006]     Ответить | Цитировать Сообщить модератору
 Re: Раскидывание xml по таблицам с применением xsd  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
and761
Может, просто Вы не в курсе, как решается данная задача? Честно говоря, мне в это верится гораздо более охотно.

уважаемый с вашей стороны ето пальцем в небо примерно
смею Вас заверить,что если кто и в курсе как рабоать с xml на сиквеле -то ето именно Mnior,в етом впоросе он пока непревзойденный метр сего дела
29 мар 13, 12:26    [14112116]     Ответить | Цитировать Сообщить модератору
 Re: Раскидывание xml по таблицам с применением xsd  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
and761
Отметиться, поспамить? Не удивляюсь, что у вас более 5 тысяч сообщений : эдак и 25 тысяч легко нащелкать.
Осторожнее на поворотах. В следующий раз можешь уйти в бан.
Вот ты так пощёлкай и попробуй найти "семечки" и доказать. И дату регистрации посмотри (сообщений в день).
Не надо вот этих неправильных поверхностных анализов.

and761
Извращения...это Вы о чем? Есть xml файл строго определенной структуры
И что? Это гарантирует её правильность/эффективность? Можно каждую букву в отдельный тег занести - и всё будет "структуированно".

and761
(если интересно, он создается на оборудовании одного из мировых лидеров телекоммуникационного рынка).
Которые в основном говно и клепают. Ибо там месиво прогеров и работают. И не надо культа тут устраивать.

and761
Наивно полагаю, что там работают далеко не первоклассники и более чем уверен
Вот лучше перестаньте быть наивным, а поработайте так в таких, и почитайте что люди вокруг пишут. Не надо домыслов.

and761
что выбор структуры файла всесторонне продуман и максимально оптимизирован под задачи загрузки.
Как раз ани под задачу и не пилят, а чтобы им "проще" было что-то нафигачить.
Одно лишь не использование атрибутов чего стоит.

and761
Может, просто Вы не в курсе, как решается данная задача?
Очень просто, заливается как есть, а PIVOT и другие манипуляции с данными делаются апосля.

Коль вы инструкцию читали:
Где в вашем XSD SQL Annotation? Привязки к таблам и FK?
Где скрипты структуры таблиц?
Не нарушайте пожайлуста правила этого форума.

Давайте ваш итоговый XSD и скрипты, а мы поправим.
29 мар 13, 13:07    [14112432]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить