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