2011-10-15 213 views
0

我有我创建务实使用C#这个XML文件: -阅读xml文件?

<Years> 
<Year Year="2011"> 
    <Month Month="10"> 
    <Day Day="10" AccessStartTime="01:15 PM" ExitTime="01:15 PM" /> 
    <Day Day="11" AccessStartTime="01:15 PM" ExitTime="01:15 PM" /> 
    <Day Day="12" AccessStartTime="01:15 PM" ExitTime="01:15 PM" /> 
    <Day Day="13" AccessStartTime="01:15 PM" ExitTime="01:15 PM" /> 
    </Month> 
    <Month Month="11"> 
    <Day Day="12" AccessStartTime="01:16 PM" ExitTime="01:16 PM" /> 
    </Month> 
    </Year> 
</Years> 

我有问题时,我想在我使用的XmlReader,以从中获取特定数据或我做了错误的方式的原因每次读取器读取一行,我想要的是获取特定月份和一年中所有日期的列表

+0

这不是XML - 它没有根节点。 –

+4

年是根节点 – ykh

+0

什么版本的C#? –

回答

3

使用Linq-XML或张贴你已经尝试的代码。

var list = from ele in XDocument.Load(@"c:\filename.xml").Descendants("Year") 
      select new 
        { 
         Year = (string)ele.Attribute("Year"), 
         Month= (string)ele.Element("Month").Attribute("Month"), 
         Day = (string)ele.Element("Month").Element("Day").Attribute("Day") 
        }; 
foreach (var t in list) 
    { 
    Console.WriteLine(t.Year + " " + t.Month + " " + t.Day); 
    } 
+0

它的工作原理,但现在我想得到特定年份和月份的所有日子如何?,并且你能给我一个参考,以了解选择代码。 – ykh

0

查看此示例如何使用根节点表示xml并使用xml读取器如何获取数据....

using System; 
using System.Xml; 

class Program 
{ 
    static void Main() 
    { 
     // Create an XML reader for this file. 
     using (XmlReader reader = XmlReader.Create("perls.xml")) 
     { 
     while (reader.Read()) 
     { 
     // Only detect start elements. 
     if (reader.IsStartElement()) 
     { 
      // Get element name and switch on it. 
      switch (reader.Name) 
      { 
      case "perls": 
       // Detect this element. 
       Console.WriteLine("Start <perls> element."); 
       break; 
      case "article": 
       // Detect this article element. 
       Console.WriteLine("Start <article> element."); 
       // Search for the attribute name on this current node. 
       string attribute = reader["name"]; 
       if (attribute != null) 
       { 
       Console.WriteLine(" Has attribute name: " + attribute); 
       } 
       // Next read will contain text. 
       if (reader.Read()) 
       { 
       Console.WriteLine(" Text node: " + reader.Value.Trim()); 
       } 
       break; 
       } 
      } 
      } 
     } 
     } 
    } 

输入文本[perls.xml]

<?xml version="1.0" encoding="utf-8" ?> 
    <perls> 
    <article name="backgroundworker"> 
    Example text. 
    </article> 
    <article name="threadpool"> 
    More text. 
    </article> 
    <article></article> 
    <article>Final text.</article> 
    </perls> 

输出

Start <perls> element. 
Start <article> element. 
    Has attribute name: backgroundworker 
    Text node: Example text. 
Start <article> element. 
    Has attribute name: threadpool 
    Text node: More text. 
Start <article> element. 
    Text node: 
Start <article> element. 
    Text node: Final text. 
1

我同意AVD使用LINQ to XML的建议。找到所有的天为一个特定的年份和月份很简单:

XDocument doc = XDocument.Load("file.xml"); 
var days = doc.Elements("Year").Where(y => (int) y.Attribute("Year") == year) 
       .Elements("Month").Where(m => (int) m.Attribute("Month") == month) 
       .Elements("Day"); 

(假设月份和年份属性上的所有月份和年份的元素指定)。

结果是Day的序列指定月份和年份的元素。

在大多数情况下,我实际上是每行写一个方法调用,但在这种情况下,我认为每行有一个元素和属性的完整过滤器看起来会更好。

请注意,在LINQ中,某些查询最终会使用查询表达式更具可读性,而其中一些在我上面使用的“点符号”中更具可读性。

你问了AVD代码的解释,所以你可能会被我的类似困惑 - 而不是解释我的代码恰好使用的LINQ to XML和LINQ的位,我强烈推荐阅读好的教程在LINQ和LINQ to XML上。他们是精彩的技术,这将帮助你的代码遍布各地。