2011-11-18 101 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將不會找到任何帶有前綴的東西。