繁体   English   中英

从XML文件读取到Sql服务器表C#

[英]reading from XML file to Sql server table C#

我想将数据从XML文件读取到sql server表,如果所有点头都存在,我的代码可以正常工作,但是如果其中一个节点不存在,则显示错误,这是我的xml文件

<?xml version="1.0" standalone="yes"?>
 <DocumentElement>
 <student>
 <rfidip>3000E2009150501900880530DE07</rfidip>
 <timegetin>2013-04-09T00:53:25+03:00</timegetin>
 <timegetout>2013-04-09T00:55:59+03:00</timegetout>
 </student>
<student>
<rfidip>3000E20075232318015114907CF6</rfidip>
<timegetin>2013-04-09T00:53:25+03:00</timegetin>
<timegetout>2013-04-09T00:55:59+03:00</timegetout>
</student>
<student>
 <rfidip>3000E20075232318015112409741</rfidip>
 <timegetin>2013-04-09T00:53:25+03:00</timegetin>
 </student>
 </DocumentElement>

这是我的代码,该代码读取XML并将数据插入到sql server表中

          XmlDocument xmlDoc = new XmlDocument();
       xmlDoc.Load("C:\\Users\\TOSHIBA\\Desktop\\student.XML");

       XmlNodeList dataNodes = xmlDoc.SelectNodes("/DocumentElement/student");

        foreach (XmlNode node in dataNodes)
           {

                   rfidip = node.SelectSingleNode("rfidip").InnerText.ToString();
                   timegetin = (node.SelectSingleNode("timegetin").InnerText);
                   timegetout = node.SelectSingleNode("timegetout").InnerText;

             sql = "insert into tripStudent (Student_ID,trip_number,time_getin,time_getout) values(@rfidip,@trip_number,@timegetin,@timegetout)";
             //sql = "insert into students values(" + rfidip + ",'" + timegetin + "'," + timegetout + ")";
              command = new SqlCommand(sql, connection);
             command.Parameters.AddWithValue("@rfidip", rfidip);
              command.Parameters.AddWithValue("@trip_number",trip_number);
              command.Parameters.AddWithValue("@timegetin", Convert.ToDateTime(timegetin));
              command.Parameters.AddWithValue("@timegetout", Convert.ToDateTime(timegetout));

               command.ExecuteNonQuery();

有谁能够帮助我...

为什么不只使用Entity Framework来更新值,而不要使用带有XML解析的XDocument呢?

string xml = @"<?xml version=""1.0"" standalone=""yes""?>
        <DocumentElement>
            <student>
                <rfidip>3000E2009150501900880530DE07</rfidip>
                <timegetin>2013-04-09T00:53:25+03:00</timegetin>
                <timegetout>2013-04-09T00:55:59+03:00</timegetout>
            </student>
            <student>
                <rfidip>3000E20075232318015114907CF6</rfidip>
                <timegetin>2013-04-09T00:53:25+03:00</timegetin>
                <timegetout>2013-04-09T00:55:59+03:00</timegetout>
            </student>
            <student>
                <rfidip>3000E20075232318015112409741</rfidip>
                <timegetin>2013-04-09T00:53:25+03:00</timegetin>
            </student>
        </DocumentElement>";

//use var xDoc = XDocument.Load(xmlPathGoesHere); if you using xml path
var xDoc = XDocument.Parse(xml);
var studentElements = xDoc.Descendants("student");

studentElements.ToList().ForEach(student => {
    //Create you Insert Query here, see sample below how to get values
    var rfid = student.Element("rfidip").Value;
    var timeIn = student.Element("timegetin").Value;
    var timeOut= string.Empty;
    try {
        timeOut = student.Element("timegetout").Value;
    } catch {
        //since you have no xml value on your time get out, I catch this line
    }
});

请参阅下面的参考:

1.) 实体框架

2.) XDocument

如果元素不存在,则SelectSingleNode返回null,因此当您对null调用InnerText时,它将引发异常,因此您可以像这样更改代码:

rfidip = (node.SelectSingleNode("rfidip") != null)? node.SelectSingleNode("rfidip").InnerText.ToString(): string.Empty; 

其他代码也一样,确保元素存在

希望这对您有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM