XML - экспорт таблиц базы данных

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Spot, 18 Oct 2011.

  1. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Привет %username%,

    сразу перейду к делу. Есть база данных, оформленная в программе DIA - вообщем графическая прорисовка таблиц в БД с оформлением данных о таблицах и параметрах в XML.
    Моя задача написать скрипт, который будет считывать данные с XML, после чего создавать БД SQL и PostGreSQL (хотя руководство тут пока ещё точно не определилось, но не суть важно).
    С XML работал я достаточно поверхностно - хранения малого количества данных - импорт/экспорт. Обходился обычной List<MyClassForDataSave> все это в коллекшен вперёд - serialiser и deserialize .

    Однако тут немного зашёл в тупик, вот пример XML:
    PHP:
    <?xml version="1.0" encoding="UTF-8"?> <dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/"> ... <dia:attribute name="name">         <dia:string>#Plants#</dia:string>       </dia:attribute>       <dia:attribute name="comment">         <dia:string>##</dia:string>       </dia:attribute>       <dia:attribute name="visible_comment">         <dia:boolean val="false"/>       </dia:attribute>       <dia:attribute name="tagging_comment">         <dia:boolean val="false"/>       </dia:attribute>       <dia:attribute name="underline_primary_key">         <dia:boolean val="true"/>       </dia:attribute>       <dia:attribute name="bold_primary_keys">         <dia:boolean val="false"/>       </dia:attribute>       <dia:attribute name="normal_font">         <dia:font family="monospace" style="0" name="Courier"/>       </dia:attribute>       <dia:attribute name="name_font">         <dia:font family="sans" style="80" name="Helvetica-Bold"/>       </dia:attribute>       <dia:attribute name="comment_font">         <dia:font family="sans" style="0" name="Helvetica"/>       </dia:attribute>       <dia:attribute name="normal_font_height">         <dia:real val="0.80000000000000004"/>       </dia:attribute>       <dia:attribute name="name_font_height">         <dia:real val="0.69999999999999996"/>       </dia:attribute>       <dia:attribute name="comment_font_height">         <dia:real val="0.69999999999999996"/>       </dia:attribute>       <dia:attribute name="attributes">         <dia:composite type="table_attribute">           <dia:attribute name="name">             <dia:string>#Id#</dia:string>           </dia:attribute>           <dia:attribute name="type">             <dia:string>#INT#</dia:string> ...
    Пытался просто подгрузить XML документ:
    PHP:
    XmlDocument doc = new XmlDocument(); doc.Load(@"C:\Dokumente\DBFromXMLTOSQL\struktur.xml");
    Выбивает ошибку:
    the hex value 0x1F, is a invalid sign, line 1, position 1)

    Порылся - говорится что нужно обьявить namespace, что я и попробывал сделать:
    PHP:
    XmlSerializerNamespaces myNamespaces =      new XmlSerializerNamespaces(); myNamespaces.Add("dia","http://www.lysator.liu.se/~alla/dia/");
    И снова тоже самое - ошибка.

    Читал про XElement вроде как бы более удобный инструмент - попытался применить - однако не умел успеха.

    Хотелось бы услышать советы и предложения - как сделать удобней, понятней и проще, так как мне с фирмы скоро уходить,а если понадобиться доработать скрипт - не хочется что- бы человек долго бился в конвульсиях пытаясь вникнуть в код и провести рефакторинг на свой лад.

    Если возможно конкретный пример как как подгрузить XML формат приведенный выше.
    П.С. изначально файл сохранялся в разрешении .dia , однако там есть функция экспорта в xml. Это только часть xml кода, не ставл вставлять целый - ибо слишком здоровый - большу 40 таблиц занесенные в xml.
    Долбанная dia:)

    Спасибо тебе %username%!
     
  2. Евгений М.

    Евгений М. New Member

    Joined:
    10 Oct 2010
    Messages:
    7
    Likes Received:
    3
    Reputations:
    0
    Попробуйте этот символ в начале убрать. Например в hex-редакторе или там Notepad2, Notepad++ если они распознают этот символ.
     
  3. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    если правильно понял, то вот пример
    и хранимая процедура

     
  4. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    inCode,
    не совсем то что я имел ввиду,для начала мне нужно с xml вытащить все таблицы.
    Не могу никак загрузить сам xml файл, вот и просил привести пример.Сегодня удалось выяснить причину ошибки - было целых две: 1. Файл был сжат 2.Кодировка была указана одна в xml файле, однако на самом деле установлена была иная.
    Отсель и ошибка, щас мучаюсь с парсом самого xml , приходиться засовывать foreach в foreach , по нескольку раз, что бы добраться до нужных параметров.Здесь тоже застрял, однако попытаюсь пока что ещё сам справится, если не получится напишу здесь, в надежде на новую идею и незамыленный взгляд.

    inCode, Евгений
    Спасибо что отписались, надеюсь если возникнут дальнейшие проблемы, поможете советом.
     
  5. B0ri$ka

    B0ri$ka Banned

    Joined:
    1 Jul 2011
    Messages:
    33
    Likes Received:
    2
    Reputations:
    0
    foreach, вложенный в другой foreach? Это что, пытаетесь найти нужные параметры перебором?
    Надо либо .SelectNodes/SelectSingleNode использовать, либо XPath
     
  6. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Я использую как раз .SelectNodes/SelectSingleNode, однако там следующая картина: 40 + таблиц, в каждой таблице n-var , для каждой var соответственно свой тип, ключи +, реляции к другим таблицам.
    То есть идёт
    foreach( Таблица1 ...Таблица 40)
    {
    foreach(var1...var-n)
    {
    ...
    }
    }

    Если есть другие предложения, буду рад выслушать :)
     
  7. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    LINQ to XML
     
    1 person likes this.
  8. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    А подойдёт если xml будет меняться? то есть не из одной xml .- надо будет вытягивтаь таблицы базы данных, а из разных/нескольких?Я так понимаю тогда прийдётся для каждой составлять отдельный перечень комманд?
    Сейчас я это реализовал через парс xml по узлам в foreach .Впринципе все работает, однако по времени занимает в среднем 1.020 секунды.Хотелось бы по возможности оптимизировать время.