最近在学习快递100网站的查询快递状态功能,API返回的是xml格式的字符串.想把它转化为datatable形式存入自己的数据库里,C#代码应如何写呢?返回的字符串内容如下:
<xml>
<nu>130005989722</nu>
<message>ok</message>
<ischeck>1</ischeck>
<com>tiantian</com>
<condition>F00</condition>
<status>1</status>
<state>3</state>
<data>
  <time>2012-12-25 18:50:22</time>
  <context>已签收,签收人是【草签】</context>
</data>
<data>
  <time>2012-12-25 11:33:27</time>
  <context>【大桥镇】的派件员【皖BJ8172】正在派件</context>
</data>
<data>
  <time>2012-12-24 18:43:29</time>
  <context>由【扬中】发往【泰州分拨中心】</context>
</data>
</xml>
先行感谢各位的指教,拜谢!xmlc#数据库

解决方案 »

  1.   

    可以转换成dataset然后从dataset里面取datatable#region 将XML转换成DataSet
        /// <summary>
        /// 将XML转换成DataSet
        /// </summary>
        /// <param name="xmlData"></param>
        /// <returns></returns>
        private static DataSet ConvertXMLToDataSet(string xmlData)
        {
            StringReader stream = null;
            XmlTextReader reader = null;
            try
            {
                DataSet xmlDS = new DataSet();
                stream = new StringReader(xmlData);
                reader = new XmlTextReader(stream);
                xmlDS.ReadXml(reader);
                return xmlDS;
            }
            catch (Exception ex)
            {
                string strTest = ex.Message;
                return null;
            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }
            }
        } 
        #endregion
      

  2.   


    您好,我测试过这种,如果xmlData直接用我上面贴的<xml>...</xml>内容,会错误,提示:路径中具有非法字符。 
      说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。  异常详细信息: System.ArgumentException: 路径中具有非法字符。您帮忙测试一下,有这个问题吗?
      

  3.   

    使用LINQ To XML解析XML中的数据,然后循环存入数据库。
    参考:
    http://blog.csdn.net/whuyi/article/details/6230118
      

  4.   

    是不是因为快递100返回的xml字符串流不符合格式规则的原因?我对xml了解很少,想就针对这个xml字符串流怎么处理请教大家.感谢!
      

  5.   

    那个代码是应付常规的xml的。
    你提供的XML明显是非常规的,要专门写一个对应的解析,可以参考下4楼网址。
      

  6.   

    http://blog.csdn.net/happy09li/article/details/7460521
      

  7.   


    好的.我基本功太差了,很多东西都不了解,搞定了就给分,谢谢!另外找到一个类似的,不知道有没有参考意义...void scDownloadString_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
    //throw new NotImplementedException();
    string returnValue = e.Result ;
    //this is source demo returnValue "{\"message\":\"ok\",\"status\":\"1\",\"link\":\"http://kuaidi100.com/chaxun?com=yuantong&nu=1780371398\",\"state\":\"3\",\"data\":[{\"time\":\"2012-03-19 15:02:42\",\"context\":\"河南省南阳市白河南/PDA正常签收扫描/签收人:孟星星 \"}]}" string
    //source demo2 e.Result = "<xml><message>ok</message><status>1</status><link>http://kuaidi100.com/chaxun?com=yuantong&amp;nu=1780371398</link><state>3</state><data><time>2012-03-19 15:02:42</time><context>河南省南阳市白河南/PDA正常签收扫描/签收人:孟星星 </context></data></xml>"
    Dictionary<string,string> dictionary = new Dictionary<string, string>();using (XmlReader xmlReader=XmlReader.Create(new StringReader(returnValue)))
    {
    while (xmlReader.Read())
    {
    //if this is the first node and name ==xml
    if (xmlReader.IsStartElement()&&(xmlReader.LocalName=="xml"))
    {
    using (XmlReader itemReader=xmlReader.ReadSubtree())
    {
    while (itemReader.Read())
    {
    //如果找到一个节点就开始读取其中内容
    if (itemReader.NodeType==XmlNodeType.Element)
    {
    string nodeName = itemReader.Name;
    itemReader.Read();
    //提取内容
    if (itemReader.NodeType==XmlNodeType.Text)
    {
    switch (nodeName)
    {
    case "message":
    dictionary.Add("message",itemReader.Value);break;
    case "status":
    dictionary.Add("status", itemReader.Value);break;
    case "link":
    dictionary.Add("link", itemReader.Value); break;
    case "state":
    dictionary.Add("state", itemReader.Value); break;
    case "time":
    dictionary.Add("time", itemReader.Value); break;
    case "context":
    dictionary.Add("context", itemReader.Value); break;
    default:
    break;
    }
    }
    }
    }
    }
    }
    }}
    string str=null;
    dictionary.TryGetValue("context", out str);
    this.txtBlockNews.Text = str;}
    }
    }
      

  8.   

       XmlDocument xd = new XmlDocument();
                xd.Load("xml格式的字符串");
                XmlElement xmlRoot = xd.DocumentElement;
                XmlNode node = xmlRoot.SelectSingleNode("data");
                string timeval = "";
                string context = "";
                foreach (XmlNode xn in node.ChildNodes)
                {
                    if (xn.Name == "time")
                        timeval = xn.InnerText;
                        if (xn.Name == "context")
                        {
                           context = xn.InnerText;
                           //插入方法就行了
                        }
                }
      

  9.   

    快递100的可以返回json格式 。你返回json格式 。然后反序列化json成model  add到数据库 岂不是更方便些!