Сохранение XML-данных в Oracle в C # - PullRequest
1 голос
/ 18 ноября 2011

У меня есть следующий XML-файл:

   <os:tax>
    <os:cat name="abc" id="1">
        <os:subcat name="bcd" id="11">
            <os:t name="def" id="111">
                <os:cut name="hello" id="161" cutURL="/abc/a.html"/>
                <os:cut name="hello2" id="162" cutURL="/abc1/a1.html"/>
                <os:cut name="hello3" id="163" cutURL="/abc4/a3.html"/>
            </os:t>
        </os:subcat>
    </os:cat>
    <os:cat name="def" id="2">
        <os:subcat name="bcd" id="22">
            <os:t name="def" id="222">
                <os:cut name="hello" id="171" cutURL="/abcs/a.html"/>
                <os:cut name="hello2" id="172" cutURL="/abcs1/a1.html"/>
                <os:cut name="hello3" id="173" cutURL="/abcs4/a3.html"/>
            </os:t>
        </os:subcat>
    </os:cat>
</os:tax>

у него больше os: cat под ним. Просто показываю два здесь для простоты использования. У меня есть таблица, как это в оракуле:

ID        os_lev         title          parent_id         cut_url
1           cat           abc            null              null
11          subcat        bcd            1                 null
111
161
162
163
2
22
...

Я хочу заполнить эту таблицу следующим образом. Я хочу знать, каков наилучший способ сделать это с консольным приложением в C #? Я делаю это:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("C:\\getxml.xml");

XmlNodeList tax= xmlDoc.GetElementsByTagName("os:tax");

foreach (XmlNode node in tax)
{
    //here i will save all the nodes? What is the best way to do this?
    //Also should i do a insert in oracle right here?
}

Должен ли этот foreach быть внутри цикла try?

1 Ответ

0 голосов
/ 20 ноября 2011

Вероятно, есть способ сделать это в LINQ в виде вставки в выбор ... из MyXLDoc, но я еще недостаточно изучил, чтобы дать вам это. Итак, продолжаем с XmlDocument.

Создайте соединение с вашей базой данных Oracle. Определите объект команды для соединения. Установите SQL в Вставить MyTable (ID, os_lev, title, parent_id, cut_url) значения (@ ID, @ os_lev, @ title, @ parentID, @ cut_url)

Теперь все, что вам нужно сделать, это перебрать xml, выкопать значения, установить соответствующий параметр и выполнить запрос.

public void SaveInDB(IdbCommand argCommand,String argFileName)
{
  using(FileStream fs = new FileStream(argFileName, FileMode.Open, FileAccess.Read))
  {
    XmlDocument doc = new XmlDocument();
    doc.Load(fs);
    XmlNamespaceManager ns = new XmlNameSpaceManager(doc.NameTable);
    ns.Add("os",doc.DocumentElement.NamespaceUri);
    foreach(XmlNode catNode in doc.DocumentElement.SelectNodes("os:cat",ns))
    {
       argCommand.Parameters["ID"].Value = catNode.Attributes["id"].Value; // convert to an int?
       argCommand.Parameters["os_lev"].Value = catNode.LocalName;
       argCommand.Parameters["title"].Value = catNode.Attributes["name"].Value;
       argCommand.Parameters["parent_id"].Value = DBnull;
       argCommand.Parameters["cut_url"].Value = DBNull;
       argCommand.ExecuteNonQuery();
       foreach(XMlNode subcatNode in catNode.SelectNodes("os:subcat",ns)
       {
         SaveSubcatInDB(argCommand,subcatNode,ns);
       } 
    }
  }
}

private static void SaveSubcatInDB(IdbCommand argCommand, XmlNode argNode, XmlNameSpaceManager argNs)
{
  // you get the idea.
}

NB. Нет ошибок при проверке, поэтому, если, скажем, ваш xml испорчен, а атрибуты name или id отсутствуют, или если id должен быть целым числом, а это не так, порции будут уничтожены. Кроме того, я написал это на макушке, так что вы можете получить волнистую или две ... И это быстрый и грязный, не элегантный и довольно многоразовый подход. Хотя это будет легко понять и отладить.

PS не забудьте менеджер пространства имен, Xpath просто не найдет ничего с префиксом, если вы не скажете ему, что к чему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...