2011-11-18 64 views
1

我有以下XML文件:保存XML数据在C#

<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:在它的猫。只是在这里显示两个易于使用。我在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内尝试循环?

+0

文档中表中有多少条记录,以及它们必须多久更换一次。有很多方法可以对这个cat进行皮肤处理。例如,XMLDocument会将整个XMLReader加载一个节点。 –

+0

@Tony - 我正在使用LINQ获取所有数据,我想知道如何将该数据移动到Oracle数据库。表应该拥有与文件中许多节点一样多的记录。 – Gurnor

回答

0

在LINQ中,可能有一种方法以Insert into Select的形式进行此操作。但是,我还没有足够的知识给你。 继续使用XmlDocument。

创建到您的oracle数据库的连接。 在连接上定义一个命令对象。 设置SQL来 插入MyTable的(ID,os_lev,标题,PARENT_ID,cut_url)VALUES(@ ID,@ os_lev,@标题,@的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被搞砸和名称或ID属性丢失,或者如果ID是成为一个int,它不是,块将被烧断。 另外我写了这个关于我的头顶,所以你可能会得到一个或两个波浪...... 这是quiick和肮脏,不雅,和很不可用的方法。虽然它很容易理解和调试。除非你告诉它什么是什么,否则Xpath不会忘记命名空间管理器,Xpath将不会找到任何带有前缀的东西。