读取xml文件?

时间:2011-10-15 07:50:14

标签: c# xml

我有一个我使用C#实现创建的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时,我想要从中获取特定数据时遇到问题或者我这样做是错误的,因为每次读者读取一行并且我想要的是获得所有列表特定月份和年份的天数

3 个答案:

答案 0 :(得分: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 );
  }

答案 1 :(得分: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");

(这假定在所有Month和Year元素上指定了Month和Year属性。)

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

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

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

你要求解释AVD的代码,所以你可能同样对我感到困惑 - 而不是解释我的代码碰巧使用的LINQ to XML和LINQ的位,我强烈建议您阅读了LINQ和LINQ to XML的优秀教程。他们是精彩的技术,可以帮助您的代码到处都是。

答案 2 :(得分:0)

看看这个例子如何用根节点表示xml并使用xml reader如何获取数据....

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.