用C#在Oracle中保存xml数据

时间:2011-11-18 18:22:34

标签: c# xml oracle

我有以下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>
它有更多的操作系统:它下面的猫。只是在这里展示两个便于使用。我在oracle中有这样的表:

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 :(得分:0)

可能有一种方法可以在LINQ中以Insert Into Select的形式执行此操作..来自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是int而不是int,那么chunk会被烧掉。 我也把它写在了我的头顶,所以你可能得到一个波浪形或两个...... 这是一种肮脏,肮脏,不可思议且非常不可靠的方法。但它很容易理解和调试。

PS不要忘记命名空间管理器,除非你告诉它什么是什么,否则Xpath将找不到任何带前缀的东西。