Модераторы: diadiavova
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как перенести xml запись в mysql 
:(
    Опции темы
lemniscate
Дата 28.9.2010, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 23.11.2009

Репутация: нет
Всего: нет



Есть такая программа Gosinsp которая составляет учебные планы, у меня стоит задача некоторые данные из этой программы перенести в базу mysql. Прога делает выгрузку в формате xml. Например есть вот такая строка которая интересует: 

Код

<Строка Дис="Русский язык и культура речи" Цикл="ГСЭ.Ф" ИдетификаторВидаПлана="1" ГОС="68" СР="34" СемЗач="4" Кафедра="15" ПодлежитИзучению="68" ИдетификаторДисциплины="ГСЭ.Ф.5">
<КредитовПоКурсам>
<Курс Ном="2" CrECTS="2" ЗЕТ="2"/>
</КредитовПоКурсам>
<Сем Ном="4" Лек="18" Пр="16" СРС="34"/>
</Строка>


в частности интересуют значения атрибутов 

прошу помочь, я в xml полный ноль, копание в инете не помогло, функция php xml_parse_into_struct не подошла. 
PM MAIL   Вверх
magelan
Дата 28.9.2010, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 7
Всего: 16



ну раз вы пришли в этот раздел, а не в пхп, то я не буду вам предлагать учиться строить DOM и с ним работать.

файл 1.xml
Код

<?xml version="1.0" encoding="Windows-1251"?>
<?xml-stylesheet type="text/xsl" href="1.xsl"?>

<Строка Дис="Русский язык и культура речи" Цикл="ГСЭ.Ф" ИдетификаторВидаПлана="1" ГОС="68" СР="34" СемЗач="4" Кафедра="15" ПодлежитИзучению="68" ИдетификаторДисциплины="ГСЭ.Ф.5">
  <КредитовПоКурсам>
      <Курс Ном="2" CrECTS="2" ЗЕТ="2"/>
  </КредитовПоКурсам>
  <Сем Ном="4" Лек="18" Пр="16" СРС="34"/>
</Строка>

файл 1.xsl
Код

<?xml version="1.0" encoding="Windows-1251"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0">
    <xsl:output method="text" />

    <xsl:template match="/">
        <xsl:apply-templates select="Строка" />
    </xsl:template>

    <xsl:variable name="map">
        <field name="Дис" table="dis" />
        <field name="Цикл" table="cycle" />
        <field name="ИдетификаторВидаПлана" table="paln_id" />
        <field name="ГОС" table="gos" />
        <field name="СР" table="cr" />
        <field name="СемЗач" table="sz" />
        <field name="Кафедра" table="kaf" />
        <field name="ПодлежитИзучению" table="learn" />
        <field name="ИдетификаторДисциплины" table="dis_id" />
    </xsl:variable>
    <xsl:template match="Строка">
        <xsl:text>INSERT INTO myTable (</xsl:text>
        <xsl:for-each select="@*">
            <xsl:variable name="fname" select="name()" />
            <xsl:value-of select="msxsl:node-set($map)/field[$fname=@name]/@table" />
            <xsl:if test="position() != last()">
                <xsl:text>, </xsl:text>
            </xsl:if>
        </xsl:for-each>
        <xsl:text>) VALUES (</xsl:text>
        <xsl:for-each select="@*">
            <xsl:text>"</xsl:text>
            <xsl:value-of select="." />
            <xsl:text>"</xsl:text>
            <xsl:if test="position() != last()">
                <xsl:text>, </xsl:text>
            </xsl:if>
        </xsl:for-each>
        <xsl:text>)</xsl:text>
    </xsl:template>
</xsl:stylesheet>


сохраняете рядышком на диске, травите на 1.xml интернет эксплорер, получаете SQL
сам XSL в базу естественно писать не умеет, но SQL для консольки может сформировать любой.
PM MAIL   Вверх
lemniscate
Дата 28.9.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 23.11.2009

Репутация: нет
Всего: нет



ого!!! супер, спасибо огромное, но вот есть одна загвоздка ... таких строк там может быть штук 20-30 и более. попробовал добавить еще одну строку и выдала естестно ошибку ("В документах XML допускается только один элемент верхнего уровня"). :( к тому же в самом xml файле который выгружается из программы куча все различных других записей, и вот из все этой кучи надо выделить только строки содержащие расчасовку.  и еще а как быть с вот этими строками: 
Код


<Сем Ном="1" Пр="34" СРС="25"/>
<Сем Ном="2" Пр="34" СРС="30"/>
<Сем Ном="3" Пр="34" СРС="34"/>
<Сем Ном="4" Пр="34" СРС="34"/>
<Сем Ном="5" Лаб="34" СРС="47" ЧасЭкз="36"/>


PM MAIL   Вверх
lemniscate
Дата 28.9.2010, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 23.11.2009

Репутация: нет
Всего: нет



Методом тыка и банальной эрудиции получилось из всего файла получить значения множества строк. 
Сделал вот так

Код

<xsl:apply-templates select="Документ/План/Строки" />


Но вот вопрос по семестровой расчасовки остался:

Код

<Сем Ном="1" Пр="34" СРС="25"/>
<Сем Ном="2" Пр="34" СРС="30"/>
<Сем Ном="3" Пр="34" СРС="34"/>
<Сем Ном="4" Пр="34" СРС="34"/>
<Сем Ном="5" Лаб="34" СРС="47" ЧасЭкз="36"/>




PM MAIL   Вверх
magelan
Дата 28.9.2010, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 7
Всего: 16



я не очень в вопрос въезжаю, по поводу "расчасовки".

есть ли в вашем первом примере нода "Сем" или нет определяется очень просто:
Код

<xsl:apply-templates select="Документ/План/Строка[Сем]" />

Выбиратся будут только "Строка" имеющая внутри "Сем".

Я вообще вам код привел в качестве абсурда не там заданного вопроса, но если вы хотите воспользоваться этой методикой, распишите подробно какой SQL вы желаете получить, сколько у вас таблиц, как поля таблиц соответствуют XML тегам и атрибутам.
Тогда я, или кто нибудь еще сможет вам написать нормальную трансформацию XML -> SQL.
PM MAIL   Вверх
lemniscate
Дата 29.9.2010, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 23.11.2009

Репутация: нет
Всего: нет



ок, все с нуля, и попорядку. 
есть такой xml файл: 

Код

<Документ >
<План ПодТип="рабочий учебный план" Шифр="PLI" ОбразовательнаяПрограмма="подготовка специалистов" ФормаОбучения="очная или вечерняя" УровеньОбразования="ВПО">
<Титул>
<Квалификации>
<Квалификация Ном="1" Название="Искусствовед" СрокОбучения="5"/>
</Квалификации>
<Специальности>
<Специальность Ном="1" Название="Искусствоведение"/>
</Специальности>
</Титул>

<СтрокиПлана>
<Строка Дис="Иностранный язык" Цикл="ГСЭ.Ф" ИдетификаторВидаПлана="1" ГОС="340" СР="170" СемЭкз="5" СемЗач="1234" Кафедра="5" ПодлежитИзучению="340" ИдетификаторДисциплины="ГСЭ.Ф.1">
<КредитовПоКурсам>
<Курс Ном="1" CrECTS="3.5" ЗЕТ="3.5"/>
<Курс Ном="2" CrECTS="4" ЗЕТ="4"/>
<Курс Ном="3" CrECTS="3.5" ЗЕТ="3.5"/>
</КредитовПоКурсам>
<Сем Ном="1" Пр="34" СРС="25"/>
<Сем Ном="2" Пр="34" СРС="30"/>
<Сем Ном="3" Пр="34" СРС="34"/>
<Сем Ном="4" Пр="34" СРС="34"/>
<Сем Ном="5" Лаб="34" СРС="47" ЧасЭкз="36"/>
</Строка>
<Строка Дис="Психология и педагогика" Цикл="ГСЭ.Ф" ИдетификаторВидаПлана="1" ГОС="136" СР="68" СемЭкз="12" ДисцплинаДляРазделов="1" ПодлежитИзучению="136" ИдетификаторДисциплины="ГСЭ.Ф.4">
<КредитовПоКурсам/>
<Сем Ном="1" Лек="18" Пр="16"/>
<Сем Ном="2" Лек="18" Пр="16"/>
</Строка>

// таких <Строк> может быть много, конкртено в этому плане их 47, 

</СтрокиПлана>


данные которые храняться в этих строках надо перегнать в таблицу mysql, вот её структура: 

таблица up_plan //содержит список дисциплин по специальности, форме обучения и часы 

up_plan_id
id_qualif        // ид квалификации
id_spec         // ид специальности
id_fo             // ид формы обучения 
id_disc          // ид дисциплины
id_kaf           // ид кафедры
vh                 // всего часов на данной специальности за все семестры (соответствует атрибуту ГОС)
sz                 // в каких семестрах зачеты (атрибут СемЗач)
se                 // в каком семестре экзамен (атрибут СемЭкз)


таблица up_plan_sem  // содержит расчасовку по семестрам, т.е. сколько практических, сколько лекционных часов в каждом семестре

id_up_plan      // ид плана
ns                    // номер семестра
pr                     // практические часы
lek                   // лекции часы
srs                   // часы, самостоятельная работа студента
PM MAIL   Вверх
magelan
Дата 29.9.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 7
Всего: 16



Это можно прибить <![CDATA[<PLAINTEXT>]]>, я себе для отладки ставил.

еще синтаксис SQL надо проверить, я честно на нем оч давно не писал.

Код

<?xml version="1.0" encoding="Windows-1251"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0">
    <xsl:output method="text" />

    <xsl:variable name="map1">
        <field name="СемЗач" table="sz" />
        <field name="СемЭкз" table="se" />
        <field name="ГОС" table="vh" />
        <field name="Кафедра" table="id_kaf" />
        <field name="ИдетификаторДисциплины" table="id_disc" />
    </xsl:variable>
    <xsl:variable name="map2">
        <field name="Ном" table="ns" />
        <field name="Пр" table="pr" />
        <field name="СРС" table="srs" />
        <field name="Лек" table="lek" />
    </xsl:variable>

    <xsl:template match="/">
        <![CDATA[<PLAINTEXT>]]>
        <xsl:apply-templates select="Документ/План" />
    </xsl:template>
    <xsl:template match="План">
        <xsl:text>
        DECLARE @plan_id uniqueidentifier
        </xsl:text>

        <xsl:apply-templates select="СтрокиПлана/Строка">
            <xsl:with-param name="qs" select="Титул/Квалификации/Квалификация" />
            <xsl:with-param name="ss" select="Титул/Специальности/Специальность" />
            <xsl:with-param name="fo" select="'null'" />
        </xsl:apply-templates>
    </xsl:template>
    <xsl:template match="Строка">
        <xsl:param name="qs" />
        <xsl:param name="ss" />
        <xsl:param name="fo" />

        <xsl:variable name="id_qualif" select="$qs[position()=1]/@Ном" />
        <xsl:variable name="id_spec" select="$ss[position()=1]/@Ном" />

        <xsl:text>
        SET @plan_id = NEWID()
        INSERT INTO up_plan ( up_plan_id, id_qualif, id_spec, id_fo, </xsl:text>
        <xsl:for-each select="msxsl:node-set($map1)/field">
            <xsl:value-of select="@table" />
            <xsl:if test="position() != last()">
                <xsl:text>, </xsl:text>
            </xsl:if>
        </xsl:for-each>
        <xsl:text> ) VALUES ( @plan_id, "</xsl:text>
        <xsl:value-of select="$id_qualif" />
        <xsl:text>", "</xsl:text>
        <xsl:value-of select="$id_spec" />
        <xsl:text>", "</xsl:text>
        <xsl:value-of select="$fo" />
        <xsl:text>", </xsl:text>

        <xsl:variable name="attr" select="@*" />
        <xsl:for-each select="msxsl:node-set($map1)/field">
            <xsl:text>"</xsl:text>
            <xsl:value-of select="$attr[name()=current()/@name]" />
            <xsl:text>"</xsl:text>
            <xsl:if test="position() != last()">
                <xsl:text>, </xsl:text>
            </xsl:if>
        </xsl:for-each>
        <xsl:text> )
        </xsl:text>
        <xsl:apply-templates select="Сем" />
    </xsl:template>
    <xsl:template match="Сем">
        <xsl:text>INSERT INTO up_plan_sem ( id_up_plan, </xsl:text>
        <xsl:for-each select="msxsl:node-set($map2)/field">
            <xsl:value-of select="@table" />
            <xsl:if test="position() != last()">
                <xsl:text>, </xsl:text>
            </xsl:if>
        </xsl:for-each>
        <xsl:text> ) VALUES ( @plan_id, </xsl:text>
        <xsl:variable name="attr" select="@*" />
        <xsl:for-each select="msxsl:node-set($map2)/field">
            <xsl:text>"</xsl:text>
            <xsl:value-of select="$attr[name()=current()/@name]" />
            <xsl:text>"</xsl:text>
            <xsl:if test="position() != last()">
                <xsl:text>, </xsl:text>
            </xsl:if>
        </xsl:for-each>
        <xsl:text> )
        </xsl:text>
    </xsl:template>
</xsl:stylesheet>


Это сообщение отредактировал(а) magelan - 29.9.2010, 14:36
PM MAIL   Вверх
lemniscate
Дата 29.9.2010, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 23.11.2009

Репутация: нет
Всего: нет



спасибо огромное, но к сожалению браузер вернул пустую страницу, ни ошибки ничего :( 
PM MAIL   Вверх
magelan
Дата 29.9.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 7
Всего: 16



У меня SQL возвращает.
Правда ваш XML мне пришлось допилить напильником до состояния валидного:
Код

<?xml version="1.0" encoding="Windows-1251"?>
<?xml-stylesheet type="text/xsl" href="1.xsl"?>

<Документ>
<План ПодТип="рабочий учебный план" Шифр="PLI" ОбразовательнаяПрограмма="подготовка специалистов" ФормаОбучения="очная или вечерняя" УровеньОбразования="ВПО">
<Титул>
<Квалификации>
<Квалификация Ном="1" Название="Искусствовед" СрокОбучения="5"/>
</Квалификации>
<Специальности>
<Специальность Ном="1" Название="Искусствоведение"/>
</Специальности>
</Титул>

<СтрокиПлана>
<Строка Дис="Иностранный язык" Цикл="ГСЭ.Ф" ИдетификаторВидаПлана="1" ГОС="340" СР="170" СемЭкз="5" СемЗач="1234" Кафедра="5" ПодлежитИзучению="340" ИдетификаторДисциплины="ГСЭ.Ф.1">
<КредитовПоКурсам>
<Курс Ном="1" CrECTS="3.5" ЗЕТ="3.5"/>
<Курс Ном="2" CrECTS="4" ЗЕТ="4"/>
<Курс Ном="3" CrECTS="3.5" ЗЕТ="3.5"/>
</КредитовПоКурсам>
<Сем Ном="1" Пр="34" СРС="25"/>
<Сем Ном="2" Пр="34" СРС="30"/>
<Сем Ном="3" Пр="34" СРС="34"/>
<Сем Ном="4" Пр="34" СРС="34"/>
<Сем Ном="5" Лаб="34" СРС="47" ЧасЭкз="36"/>
</Строка>
<Строка Дис="Психология и педагогика" Цикл="ГСЭ.Ф" ИдетификаторВидаПлана="1" ГОС="136" СР="68" СемЭкз="12" ДисцплинаДляРазделов="1" ПодлежитИзучению="136" ИдетификаторДисциплины="ГСЭ.Ф.4">
<КредитовПоКурсам/>
<Сем Ном="1" Лек="18" Пр="16"/>
<Сем Ном="2" Лек="18" Пр="16"/>
</Строка>
<!--
// таких <Строк> может быть много, конкртено в этому плане их 47,
-->
</СтрокиПлана>
</План>
</Документ>

PM MAIL   Вверх
lemniscate
Дата 30.9.2010, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 23.11.2009

Репутация: нет
Всего: нет



Спасибо огромное, переделал вот в таком виде 

Код

INSERT INTO up_plan ( up_plan_id, id_subspec, id_speciality, id_formobuch, sz, se, vh, id_kaf, id_discipline ) VALUES ( null, "менеджер", "080507.65 Менеджмент организации", "null", "1", "2", "136", "8", "Отечественная история" );
        INSERT INTO up_plan_sem ( id_up_plan, ns, pr, srs, lek, che ) VALUES ( (SELECT LAST_INSERT_ID()), "1", "18", "", "18", "" );
        INSERT INTO up_plan_sem ( id_up_plan, ns, pr, srs, lek, che ) VALUES ( (SELECT LAST_INSERT_ID()), "2", "16", "68", "16", "36" );


дело автоматизировал.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0509 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.