开发者

Reading xml file?

开发者 https://www.devze.com 2023-04-13 09:23 出处:网络
I have this xml file that i have created pragmatically using C# :- <Years> <Year Year=\"2011\">

I have this xml file that i have created pragmatically using 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>

I am having problems when i want to get specfic data from it while i am using XmlReader or i am doin开发者_开发技巧g it the wrong way cause each time the reader reads one single line and i what i want is to get a list of all days in a specific month and a year


Use Linq-XML or post the code you have tried.

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


I agree with AVD's suggestion of using LINQ to XML. Finding all the days for a specific year and month is simple:

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");

(This assumes that Month and Year attributes are specified on all Month and Year elements.)

The result is a sequence of the Day elements for the specified month and year.

In most cases I'd actually write one method call per line, but in this case I thought it looked better to have one full filter of both element and attribute per line.

Note that in LINQ, some queries end up being more readable using query expressions, and some are more readable in the "dot notation" I've used above.

You asked for an explanation of AVD's code, so you may be similarly perplexed by mine - rather than explain the bits of LINQ to XML and LINQ that my code happens to use, I strongly recommend that you read good tutorials on both LINQ and LINQ to XML. They're wonderful technologies which will help your code all over the place.


Take a look at this example how to represent the xml with root node and using xml reader how to get the data ....

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;
               }
           }
             }
        }
      }
   }

Input text [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>

Output

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.
0

精彩评论

暂无评论...
验证码 换一张
取 消