直接用DataSet对象的ReadrXml()方法就行了

解决方案 »

  1.   

    谢谢,怎么来用?给一个代码示例吧。这个方法以前没用过。比如string responseTxt = Get_Http(aliay_url, 120000); responseTxt就是整个xml的内容。 怎么用ReadrXml()这个方法? 然后dataset就有数据了吗?
      

  2.   

                DataSet ds = new DataSet();
                ds.ReadXml("文件路径");
    之后就可以绑定了
      

  3.   

    CDATA就等同于文本数据,只是为了防止特殊字符的误解而加的标记。用InnerText属生就可以了不过,像这种LZ的Xml文件,完全没有发挥出Xml的优势,和一般的文本文件没什么两样。
      

  4.   

    responseTxt的值就是整个xml文件的值,我不想把她写入一个文件,然后再加载它。我怎么才能直接把这个字符串类型的responseTxt,绑定到DataSet。DataSet有八个重载的方法。没有一个直接能用呀。是不是还要经过一些转化。如先转化为XmlReader 。能给出代码吗?非常感谢
      

  5.   

            //声明XmlReader对象,因为从数据读的时候返回的是这个对象,方便两种方式读取
            XmlReader reader = null;
            SqlConnection conn = null;
            SqlCommand cmd = null;
            try
            {
                //此变量用判断是否从数据集读还是文件中读
                bool israd = true;
                conn = new SqlConnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=True");
                conn.Open();
                cmd = conn.CreateCommand();
                cmd.CommandText = "SELECT [EmployeeID], [City], [Title] FROM [Employees] for xml auto";
                //使用三元运算符创建XmlReader对像
                reader = israd ? cmd.ExecuteXmlReader() : new XmlTextReader(Request.MapPath("books.xml"));
                while (reader.Read())
                {
                    switch (reader.NodeType)
                    {                       
                             //是否是声明
                        case XmlNodeType.XmlDeclaration:
                            Response.Write(Server.HtmlEncode("<?xml version='1.0'?>") + "</br>");
                            break;             
                             //是否是指今
                        case XmlNodeType.ProcessingInstruction:
                            Response.Write(Server.HtmlEncode("<?" + reader.Name + " " + reader.Value + "?>") + "</br>");
                            break;
                            //是否是元素
                        case XmlNodeType.Element:
                            Response.Write(Server.HtmlEncode("<")+reader.Name);
                            //判断某个元素是否具有属性
                            if (reader.HasAttributes)
                            {
                                //使用循环读出里面的所有属性
                                for (int i = 0; i < reader.AttributeCount; i++)
                                {
                                    //使用这个方法依次移动属性
                                    reader.MoveToAttribute(i);
                                    Response.Write("  "+reader.Name+"=" + reader[i]);
                                }
                            }
                           Response.Write(Server.HtmlEncode(">")+"</br>");
                            break;
                            //是否是文本
                        case XmlNodeType.Text:
                            Response.Write(reader.Value+"</br>");
                            break;
                            //是否是注释
                        case XmlNodeType.Comment:
                            Response.Write(Server.HtmlEncode("<!--" + reader.Value + "-->") + "</br>");
                            break;
                            //是否是结束元素
                        case XmlNodeType.EndElement:
                            Response.Write(Server.HtmlEncode("</" + reader.Name + ">") + "</br>");
                            break;
                    }
                }
            }
            catch(Exception ex)
            {
                Response.Write(ex.Message);
            }
            finally
            {
                //关闭读取器
                if (reader != null)
                {
                    reader.Close();
                }
                //关闭数据库连接
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
            }
      

  6.   

    {
       CDATA就等同于文本数据,只是为了防止特殊字符的误解而加的标记。用InnerText属生就可以了    不过,像这种LZ的Xml文件,完全没有发挥出Xml的优势,和一般的文本文件没什么两样。
    }还是不知道怎么来用?能否给出完整代码?再此表示忠心的感谢
      

  7.   

    如果你要操作XML文件最好是有XmlReader,XmlReader类和XmlDocument类 ,XmlDataDocument类XmlReader,XmlReader类对应的是XML中的SAX接口,只不过微软用这两个类将推模式改成拉模式。
    XmlDocument类 ,XmlDataDocument类对应对应的是XML中的DOM接口你可以看看这两种类中的方法一定可以读出你的数据。
      

  8.   

    reader.Value 
    可以取到CDATA元素的数据,但不能绑定到dataset或者datatable中
    1.
                 //responseTxt使整个xml文件的字符串
                 string responseTxt = Get_Http(aliay_url, 120000);            XmlDocument doc = new XmlDocument();
                doc.LoadXml(responseTxt);
                XmlNode xmlNode = doc.SelectSingleNode("alipay/response/csv_result/csv_data");            DataSet ds=new DataSet();            //xmlNode.InnerText这个字符串就是CDATA元素的数据,他的值是:
                  <![CDATA[外部订单号,账户余额(元),时间,流水号,支付宝交易号,交易对方Email,交易对方,用户编号,收入(元),支出(元),交易场所,商品名称,类型,说明, ,948.00,2006年12月21日 11:08:32,61133760,2006122101685859,[email protected],陈超,2088002003057593,,-1.00,支付宝,11,在线支付,, ,949.00,2006年12月21日 10:36:40,61133740,2006122101685855,[email protected],陈超,2088002003057593,,-1.00,支付宝,11,在线支付,, ,950.00,2006年12月21日 10:22:50,61133710,2006122101685852,[email protected],陈超,2088002003057593,,-1.00,支付宝,11,在线支付,, ,951.00,2006年12月21日09:25:59,61133700,2006122101685850,[email protected],陈超,2088002003057593,,-1.00,支付宝,1111,在线支付,, ,952.00,2006年12月21日 09:20:27,61133690,2006122101685849,[email protected],陈超,2088002003057593,,-1.00,淘宝,1111,在线支付,, ]]>
                //然后把CDATA元素的数据的数据绑定到ds上面,但会报错,有非法字符。因为他需要是文件名的路径。而不是CDATA数据。
                ds.ReadXml(xmlNode.InnerText);            DataTable dt=ds1.Tables[0];
    2.我可以得到整个xml文件的xmlreader,然后帮定到dataset上面
                      HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(a_strUrl);
                    myReq.Timeout = timeout;
                    HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();
                    Stream myStream = HttpWResp.GetResponseStream();
                    //得到xmlreader
                    XmlReader reader = XmlReader.Create(myStream);
                    DataSet ds = new DataSet();
                    //绑定到DataSet 
                    ds.ReadXml(reader);
                    DataTable dt = ds.Tables[0];
    这样不报错。但是不是我需要的数据。这样dt只有四列。根本没有 CDATA元素的数据。
    我想是datatable中包含:外部订单号,账户余额(元),时间,流水号,支付宝交易号,交易对方Email,交易对方,用户编号,收入(元),支出(元),交易场所,商品名称,类型,说明        这些列,以及对应这些列的数据绑定到datatable中。有没有办法对CDATA元素数据 直接绑定到dataset上面去? 谢谢指教
      

  9.   

    那只有用读取器了
     //声明XmlReader对象,因为从数据读的时候返回的是这个对象,方便两种方式读取
            XmlReader reader = null;
            SqlConnection conn = null;
            SqlCommand cmd = null;
            try
            {
                //此变量用判断是否从数据集读还是文件中读
                bool israd = true;
                conn = new SqlConnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=True");
                conn.Open();
                cmd = conn.CreateCommand();
                cmd.CommandText = "SELECT [EmployeeID], [City], [Title] FROM [Employees] for xml auto";
                //使用三元运算符创建XmlReader对像
                reader = israd ? cmd.ExecuteXmlReader() : new XmlTextReader(Request.MapPath("books.xml"));
                while (reader.Read())
                {
                    switch (reader.NodeType)
                    {                       
                             //是否是声明
                        case XmlNodeType.XmlDeclaration:
                            Response.Write(Server.HtmlEncode("<?xml version='1.0'?>") + "</br>");
                            break;             
                             //是否是指今
                        case XmlNodeType.ProcessingInstruction:
                            Response.Write(Server.HtmlEncode("<?" + reader.Name + " " + reader.Value + "?>") + "</br>");
                            break;
                            //是否是元素
                        case XmlNodeType.Element:
                            Response.Write(Server.HtmlEncode("<")+reader.Name);
                            //判断某个元素是否具有属性
                            if (reader.HasAttributes)
                            {
                                //使用循环读出里面的所有属性
                                for (int i = 0; i < reader.AttributeCount; i++)
                                {
                                    //使用这个方法依次移动属性
                                    reader.MoveToAttribute(i);
                                    Response.Write("  "+reader.Name+"=" + reader[i]);
                                }
                            }
                           Response.Write(Server.HtmlEncode(">")+"</br>");
                            break;
                            //是否是文本
                        case XmlNodeType.Text:
                            Response.Write(reader.Value+"</br>");
                            break;
                            //是否是注释
                        case XmlNodeType.Comment:
                            Response.Write(Server.HtmlEncode("<!--" + reader.Value + "-->") + "</br>");
                            break;
                            //是否是结束元素
                        case XmlNodeType.EndElement:
                            Response.Write(Server.HtmlEncode("</" + reader.Name + ">") + "</br>");
                            break;
                    }
                }
            }
            catch(Exception ex)
            {
                Response.Write(ex.Message);
            }
            finally
            {
                //关闭读取器
                if (reader != null)
                {
                    reader.Close();
                }
                //关闭数据库连接
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
            }
      

  10.   

    这个我用过了,cdata是文本类型数据,
    //是否是文本 
                        case XmlNodeType.Text: 
                            Response.Write(reader.Value+" </br>"); 
                            break; 
    执行到这里,reader.Value也是一个字符串:还是这个值:<![CDATA[外部订单号,账户余额(元),时间,流水号,支付宝交易号,交易对方Email,交易对方,用户编号,收入(元),支出(元),交易场所,商品名称,类型,说明, ,948.00,2006年12月21日 11:08:32,61133760,2006122101685859,[email protected],陈超,2088002003057593,,-1.00,支付宝,11,在线支付,, ,949.00,2006年12月21日 10:36:40,61133740,2006122101685855,[email protected],陈超,2088002003057593,,-1.00,支付宝,11,在线支付,, ,950.00,2006年12月21日 10:22:50,61133710,2006122101685852,[email protected],陈超,2088002003057593,,-1.00,支付宝,11,在线支付,, ,951.00,2006年12月21日09:25:59,61133700,2006122101685850,[email protected],陈超,2088002003057593,,-1.00,支付宝,1111,在线支付,, ,952.00,2006年12月21日 09:20:27,61133690,2006122101685849,[email protected],陈超,2088002003057593,,-1.00,淘宝,1111,在线支付,, ]]> 但是也没有办法绑定到dataset呀?有什么办法可以绑定到dataset?