我有以下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循环中吗?
答案 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将找不到任何带前缀的东西。