C#查询xml

sunny906 2011-09-16 12:34:18
xml内容:

<?xml version="1.0" encoding="utf-8" ?>
<xml>
<rows>
<row date="2011-09-15" num="1" />
<row date="2011-09-16" num="2" />
<row date="2011-09-17" num="3" />
<row date="2011-09-18" num="4" />
<row date="2011-09-19" num="5" />
<row date="2011-09-20" num="6" />
</rows>
</xml>


读取xml中大于当前日期的内容:

XmlDocument xml = new XmlDocument();
xml.Load("D:\\1.xml");
String s = String.Format("xml/rows/row[@date>'{0}']", DateTime.Now.ToString("yyyy-MM-dd"));
XmlNodeList nodes = xml.SelectNodes(s);
Console.WriteLine(nodes.Count);


问题是:
1.当条件是[@date>'{0}']的时候,为什么查不到结果?
2.当条件是[@num>'{0}']的时候,可以查出结果;查询条件是日期和非日期时的写法有什么区别吗?
...全文
172 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
老朱. 2011-10-18
  • 打赏
  • 举报
回复
看来csdn上的高手就是多啊,我顺便问一下各位啊,在xml中怎么实现自增长呢,像sql中的identity一样
sunny906 2011-09-16
  • 打赏
  • 举报
回复
方法还是挺多的
sunny906 2011-09-16
  • 打赏
  • 举报
回复
谢谢各位了
  • 打赏
  • 举报
回复
IEnumerable<XmlNode> nodes = xml.SelectNodes("xml/rows/row")
.Cast<XmlNode>()
.Where(node => node.Attributes["date"].Value.CompareTo(DateTime.Now.ToString("yyyy-MM-dd")) > 0);

2005
把上面两个换成

foeach(XmlNode node in xml.SelectNodes("xml/rows/row"))
if(node.Attributes["date"].Value.CompareTo(DateTime.Now.ToString("yyyy-MM-dd")) > 0)
nodeList.Add(node);
huangwenquan123 2011-09-16
  • 打赏
  • 举报
回复

/*
2011-09-17
2011-09-18
2011-09-19
2011-09-20
*/
huangwenquan123 2011-09-16
  • 打赏
  • 举报
回复

FileStream fs = new FileStream(@"E:\1.xml", FileMode.Open, FileAccess.Read);
DataSet ds = new DataSet();
ds.ReadXml(fs);
DataRow[] row = ds.Tables["row"].Select("date>'" + DateTime.Now.ToString("yyyy-MM-dd") + "'");
foreach (DataRow r in row)
Console.WriteLine(r["date"]);
fs.Close();
fs.Dispose();
marskiller022 2011-09-16
  • 打赏
  • 举报
回复
建议用linq to xml ,那里可以使用数据转换,将字符串换成日期进行对比选择
sunny906 2011-09-16
  • 打赏
  • 举报
回复
谢谢LS,不知道vs2005有没有简单的方法
我是这样写的,但是感觉不太简洁

XmlDocument xml = new XmlDocument();
xml.Load("D:\\1.xml");
//String s = string.Format("xml/rows/row[@date>'{0}']", DateTime.Now);
List<XmlNode> list = new List<XmlNode>();
XmlNodeList nodes = xml.SelectNodes("xml/rows/row");
foreach (XmlNode node in nodes)
{
if (DateTime.Compare(Convert.ToDateTime(node.Attributes["date"].Value), Convert.ToDateTime( DateTime.Now.ToString("yyyy-MM-dd")))>0)
{
list.Add(node);
}
}
foreach (XmlNode node in list)
{
Console.WriteLine(node.Attributes["date"].Value);
}
  • 打赏
  • 举报
回复
这样也可以

var result = xDoc.Descendants("row").Where(xe => xe.Attribute("date").Value.CompareTo(DateTime.Now.ToString("yyyy-MM-dd")) > 0);
//LZ的方法
XmlDocument xml = new XmlDocument();
xml.Load("D:\\1.xml");
IEnumerable<XmlNode> nodes = xml.SelectNodes("xml/rows/row")
.Cast<XmlNode>()
.Where(node => node.Attributes["date"].Value.CompareTo(DateTime.Now.ToString("yyyy-MM-dd")) > 0);
Console.WriteLine(nodes.Count);

C#并没有提供string类型的> <运算符,你需要自己重载
  • 打赏
  • 举报
回复
using System.Linq;
using System.Xml.Linq;
  • 打赏
  • 举报
回复
用强类型的

string xmlSource = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<xml>
<rows>
<row date=""2011-09-15"" num=""1"" />
<row date=""2011-09-16"" num=""2"" />
<row date=""2011-09-17"" num=""3"" />
<row date=""2011-09-18"" num=""4"" />
<row date=""2011-09-19"" num=""5"" />
<row date=""2011-09-20"" num=""6"" />
</rows>
</xml>";
XDocument xDoc = XDocument.Parse(xmlSource);
var result = xDoc.Descendants("row").Where(xe => DateTime.Parse(xe.Attribute("date").Value) > DateTime.Now);
result.ToList().ForEach(xe => Response.Write(xe.Attribute("date").Value + " "));

/*
2011-09-17 2011-09-18 2011-09-19 2011-09-20
*/
sunny906 2011-09-16
  • 打赏
  • 举报
回复
这样写吗?也不对

String s = String.Format("xml/rows/row[@date>'{0}']", DateTime.Now;
qianainan 2011-09-16
  • 打赏
  • 举报
回复
试试日期比较

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧