热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

中午休息大家帮忙看看,XML文件操作问?绑顶有分!!!

我把XML数据读取到datatable中。然后用datatable.select(id&id)这样进行筛选绑定,如果id<10的话,没有问题。数据都能读出来。但如果id>
我把XML数据读取到datatable中。然后用datatable.select("id=" & id)这样进行筛选绑定,如果id<10的话,没有问题。数据都能读出来。但如果id>=10时。不能读出数据!!没想什么原因!!
   顺便提醒大家。不是传值的问题。我直接写成:datatable.select("id=10")也不行!!极郁闷中。。高手们路过支招!!!

45 个解决方案

#1


sf

#2


1:xml构十行数据吗?
2:单步调试,看看datatable中的数据.

#3


帮顶

#4


学习 关注
帮顶

#5


如果本来就没有id>10的数据,你怎么解决也是解决不了的。
你还是先看看吧。

#6


没有代码,设个断点单步调试一下

#7


调式看看你的DataTable中存的是什么

#8


帮顶,LZ还是看下数据里有id>10的没

#9


看看数据

#10


关注,帮顶下!

#11


#12


ding

#13


看看你datatable的id列是字符串还是int型的,估计是select的时候因为字段是字符串型,比较就当作字符串来比较了。

#14


准备xml的时候同时准备Schema
下面是一个简单的示例
using System;
using System.Reflection;
using System.Data;
using System.Xml;
using System.IO;
using System.Text;
class A
{
   
    public static void Main(String[] args)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("id", typeof(int));
        dt.Columns.Add("str", typeof(string));
        dt.Rows.Add(new object[] {9,"9" });
        dt.Rows.Add(new object[] { 10, "10" });
        dt.Rows.Add(new object[] { 11, "11" });


        DataSet ds = new DataSet();
        ds.Tables.Add(dt);
        //不同时写入Schema.则读取出来时因为无法分析数据格式可能导至select出错
        //ds.WriteXml("xmlfile");
        ds.WriteXml("xmlfilewithschema",XmlWriteMode.WriteSchema);
        ds.Tables.Remove(dt);

        //同时读出时也带着Schema一起读出可以有效还原数据格式
        //ds.ReadXml("xmlfile");
        ds.ReadXml("xmlfilewithschema", XmlReadMode.ReadSchema);
        dt = ds.Tables[0];
       
        PrintTable(dt,"id=10");
        PrintTable(dt, "id>10");
        PrintTable(dt, "id<10");
        
        Console.Read();
               
    }

    static void PrintTable(DataTable dt,string condition)
    {
        
        DataRow[] drs = dt.Select(condition);
        
        Console.WriteLine("条件:{0}记录数:{1}",condition ,drs.Length);
        foreach(DataRow dr in drs){
            foreach (DataColumn col in dt.Columns)
            {
                Console.Write("{0}:{1}\t",col.Caption,dr[col.Caption] );
            }
            Console.Write("\r\n");
        }
    }
}

#15


刚吃完饭回来
楼主可以调试一下进一步看看是哪的问题
是数据类型还是数据源的问题
帮顶

#16


帮顶

#17


幫頂...
XML取第10筆後的數據好像問題滿多的

#18


帮顶下!

#19


如果本来就没有id>10的数据,你怎么解决也是解决不了的。
你还是先看看吧。

#20


sf jf

#21


ding

#22


jf

#23


帮顶,顺便学习

#24


我说id>=10当然是有啊。。。其它都能读出来。为什么大于等于10以后就不行了呢!!

#25


up

#26


id>=10中的数据里面有非法值

#27


我改成int32类型。还是不行!!!!不知道怎么回事了!!

#28


顶      !!!

#29


id>=10中的数据里面有非法值
---------------------------
怎么还没明白我的意思.我是说我筛选的ID大于或者等于10以后就有问题.并没id>=10这个判断!!

#30


看来还差一点就解决了,如果楼主把源程序帖出来,说不定我就可以帮帮你了

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
接分

#31


using System;
using System.Data;


class A
{
   
    public static void Main(String[] args)
    {


        DataTable dt = CreateTable();
        DataSet ds = new DataSet();
        ds.Tables.Add(dt);
        ds.WriteXml("xmlfile");
        /*这时候XML文件内容为
         * 

  
    9
    9
  

  
    10
    10
  

  
    11
    11
  


         * 稍后读入到datatable时,id字段的类型为String
         */
        ds.Tables.Remove(dt);
        ds.ReadXml("xmlfile");
        dt = ds.Tables[0];
        PrintTable(dt,"id=10");
        PrintTable(dt, "id>10");
        /*这时候select id<10找不到9,实现的细节可能要看select的实现*/
        PrintTable(dt, "id<10");



        dt = CreateTable();
        ds = new DataSet();
        ds.Tables.Add(dt);
        ds.WriteXml("xmlfilewithschema", XmlWriteMode.WriteSchema);
        /*这时候XML文件内容为,看 
         * 配置节决定了id是整型
      * 

  
    
      
        
          
            
              
                
                
              

            

          
        
      

    
  
  
    9
    9
  

  
    10
    10
  

  
    11
    11
  


      * 稍后读入到datatable时,id字段的类型为int32
      */
        ds.Tables.Remove(dt);
        ds.ReadXml("xmlfilewithschema", XmlReadMode.ReadSchema);
        dt = ds.Tables[0];
        PrintTable(dt, "id=10");
        PrintTable(dt, "id>10");
        PrintTable(dt, "id<10");
        Console.Read();
               
    }

    static DataTable CreateTable() {
        DataTable dt = new DataTable();
        dt.Columns.Add("id", typeof(int));
        dt.Columns.Add("str", typeof(string));
        dt.Rows.Add(new object[] { 9, "9" });
        dt.Rows.Add(new object[] { 10, "10" });
        dt.Rows.Add(new object[] { 11, "11" });
        return dt;
    }

    static void PrintTable(DataTable dt,string condition)
    {
        
        DataRow[] drs = dt.Select(condition);
        Console.WriteLine("条件:{0}记录数:{1}",condition ,drs.Length);
        foreach (DataColumn col in dt.Columns)
        {
            Console.Write("{0}:{1}\t", col.Caption, col.DataType.Name);
        }
        Console.Write("\r\n");
        foreach(DataRow dr in drs){
            foreach (DataColumn col in dt.Columns)
            {
                Console.Write("{0}\t",dr[col.Caption] );
            }
            Console.Write("\r\n");
        }
    }
}
=====运行结果

条件:id=10记录数:1
id:String       str:String
10      10
条件:id>10记录数:1
id:String       str:String
11      11
条件:id<10记录数:0
id:String       str:String
条件:id=10记录数:1
id:Int32        str:String
10      10
条件:id>10记录数:1
id:Int32        str:String
11      11
条件:id<10记录数:1
id:Int32        str:String
9       9

#32


我觉得是 Console.WriteLine("条件:{0}记录数:{1}",condition ,drs.Length);的问题,drs.Length 是dtrow的长度,不是 dt 的长度

#33


mark

#34



blackant2(寻找武汉工作机会QQ17754266email:blackant@tt8.cn) ( ) 信誉:100 
辛苦了!!

源碼:
    ''' 
    ''' 根据ID,XML文件返回BBS主题
    ''' 

    ''' 
    ''' 
    ''' 
    ''' 
    Public Function getbbs(ByVal [id] As Integer, ByVal path As String) As DataView
        Dim dt As DataTable = New DataTable()

        Dim dtr As DataTable = New DataTable()
        dtr.Columns.Add("id", GetType(Int32))
        dtr.Columns.Add("content", GetType(String))
        dtr.Columns.Add("author", GetType(String))
        dtr.Columns.Add("date", GetType(String))
        dtr.Columns.Add("title", GetType(String))
        dtr.Columns.Add("new", GetType(String))       //这列是没用的.如果不添加就说我添加的列太少.内容超填充不了!!不知为何!!

        dtr.Columns.Add("ip", GetType(String))

        Dim dv As DataView = New DataView()
        Dim stream As FileStream = New FileStream(Server.MapPath(path), FileMode.Open)
        Dim doc As XmlDataDocument = New XmlDataDocument
        doc.DataSet.ReadXml(New StreamReader(stream))
        dt = doc.DataSet.Tables(0)

        Dim dr() As DataRow = dt.Select("[id]=" & [id])
        Dim i As Integer
        For i = 0 To dr.Length - 1
            dtr.Rows.Add(New Object() {dr(i).Item("id"), dr(i).Item("content").ToString, dr(i).Item("author").ToString, dr(i).Item("date").ToString, dr(i).Item("title").ToString, dr(i).Item("date").ToString, dr(i).Item("ip").ToString})
        Next
        dv = dtr.DefaultView
        stream.Close()
        Return dv
    End Function
返回一个dataview!!!大家帮忙看看!!

#35


Dim dr() As DataRow = dt.Select("[id]=" & [id])
Dim i As Integer
For i = 0 To dr.Length - 1
dtr.Rows.Add(New Object() {dr(i).Item("id"), dr(i).Item("content").ToString, dr(i).Item("author").ToString, dr(i).Item("date").ToString, dr(i).Item("title").ToString, dr(i).Item("date").ToString, dr(i).Item("ip").ToString})
Next

========
用C#写,不习惯vb
DataView dv=dt.defaultview;
for(int i=0;i    dtr.rows.add(...............);
}
dv=dtr.defaultview;
dv.rowfilter="id>10";

#36


帮顶

#37


帮顶

接分

#38


其实使用table copy to table的方法给人感觉好笨拙
另一个可行的方法是使用InferTypedSchema参数进行强类型架构推断(如果xml是良构的,一般不会抛出异常),下面也是一个示例
using System;
using System.Data;
using System.IO;
using System.Text;


class A
{
   
    public static void Main(String[] args)
    {
        string xml = @"

9
9


10
10


11
11

";
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));
        DataSet ds = new DataSet();
        //本例中使用推断强类型架构,可以将id推断为byte,同样可以进行比较
        ds.ReadXml(ms, XmlReadMode.InferTypedSchema);
        DataTable dt = ds.Tables[0];
        PrintTable(dt, "id>10");
        PrintTable(dt, "id=10");
        PrintTable(dt, "id<10");

        Console.Read();
               
    }

   

    static void PrintTable(DataTable dt,string condition)
    {
        
        DataRow[] drs = dt.Select(condition);
        Console.WriteLine("条件:{0}记录数:{1}",condition ,drs.Length);
        foreach (DataColumn col in dt.Columns)
        {
            Console.Write("{0}:{1}\t", col.Caption, col.DataType.Name);
        }
        Console.Write("\r\n");
        foreach(DataRow dr in drs){
            foreach (DataColumn col in dt.Columns)
            {
                Console.Write("{0}\t",dr[col.Caption] );
            }
            Console.Write("\r\n");
        }
    }
}

================运行结果
条件:id>10记录数:1
id:Byte str:Byte
11      11
条件:id=10记录数:1
id:Byte str:Byte
10      10
条件:id<10记录数:1
id:Byte str:Byte
9       9

#39


DataView dv=dt.defaultview;
for(int i=0;i    dtr.rows.add(...............);
}
dv=dtr.defaultview;
dv.rowfilter="id>10";
----------------------------------
大哥.我已经筛选一次.再筛选一下有用吗?麻烦你改个全一点,C#没事.我能看懂!多谢了!

#40


帮顶,学习

#41


直接用:dv.rowfilter="id=" & id行了!!!!!辛苦各位了!!结了吧!!

#42


关注

#43


不明白说什么, 简单的逻辑处理而已, 再不明白输出DataTable 的数据看看

#44


楼主的程序中最好不要用datarow.进行过滤,再返回table.

dataview dv=tables[0].defaultview

dv.RowFilter = "cint(id)>10";

注意数据类型的变化

#45


路过 学习下

推荐阅读
author-avatar
Scarlett_girl
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有