读取xml文件

本文关键字:文件 xml 读取 | 更新日期: 2023-09-27 18:11:32

我有这个xml文件,我已经创建实用使用c#:-

<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或我这样做是错误的方式,因为每次读者读取单行,我想要的是获得所有天的列表在一个特定的月份和一年

读取xml文件

使用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 );
  }

我同意AVD对XML使用LINQ的建议。查找特定年份和月份的所有天数很简单:

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的优秀教程。它们是非常棒的技术,可以在任何地方帮助你的代码。

看一下这个例子如何用根节点表示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;
               }
           }
             }
        }
      }
   }

输入文本[perl .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.