0

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

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

我想知道如何只读取 value="2012-11-15Z" 的节点 Period

所以下面的一个:

这是我使用的代码

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

这似乎不起作用..

有人能帮我吗 ?

4

2 回答 2

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
于 2012-11-15T12:15:40.380 回答
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);
}
于 2012-11-15T12:16:24.943 回答