读取XML属性

时间:2012-11-15 12:08:55

标签: c# xml linq linq-to-xml

我实际上是在尝试阅读这段XML。

http://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/xml/351352?res=3hourly&key=99b9f578-ad3d-446c-9d29-0bbee028b483

我想知道如何只读取节点Period,其值为“2012-11-15Z”

所以下面的那个:

这是我使用的代码

 using (XmlReader reader = XmlReader.Create("http://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/xml/351352?res=3hourly&key=99b9f578-ad3d-446c-9d29-0bbee028b483"))
    {
        reader.MoveToContent();
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element
                && reader.Name == "Period")
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element &&
                        reader.Name == "Rep")
                    {
                        first.Text = reader.GetAttribute("T");
                    }
                }


            }
        }
    }

我只能阅读此节点的方式是什么?

我应该写

if (reader.NodeType == XmlNodeType.Element && reader.Name == "Period" && reader.GetAttribute("value") == "2012-11-15Z")

这似乎不起作用..

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

您可以使用LINQ to XML轻松完成此操作:

XDocument xdoc = XDocument.Load(path_to_xml);
var period = xdoc.Descendants("Period")
                 .Where(p => (string)p.Attribute("value") == "2012-11-15Z") 
                 .SingleOrDefault();

它将返回XElement,但您可以从句点中选择任何数据。例如。 T属性:

List<int> tList = xdoc.Descendants("Period")
                      .Where(p => (string)p.Attribute("value") == "2012-11-15Z")
                      .SelectMany(p => p.Elements())
                      .Select(rep => (int)rep.Attribute("T"))
                      .ToList();

var query = xdoc.Descendants("Period")
                .Where(p => (string)p.Attribute("value") == "2012-11-15Z")
                .SelectMany(p => p.Elements())
                .Select(rep => new { 
                      T = (int)rep.Attribute("T"),
                      D = (string)rep.Attribute("D") })
                .ToList();

上次查询将返回具有整数属性T和字符串属性D的强类型匿名对象的列表:

 foreach(var x in query)
     // use x.T and x.D

答案 1 :(得分:0)

尝试使用xpath来查找像这样的值

XmlDocument doc = new XmlDocument();
using (XmlReader reader = XmlReader.Create("http://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/xml/351352?res=3hourly&key=99b9f578-ad3d-446c-9d29-0bbee028b483"))
{
    doc.Load(reader);
    XmlNodeList list = doc.SelectNodes("//Period[@value='2012-11-15Z']");
    Console.WriteLine(list.Count);
}