用linq查询xml

时间:2013-09-18 07:34:08

标签: c# xml linq

所以我很难理解如何在C#中使用linq。我找到了一些例子,但找不到符合我要求的案例。给出以下xml:

<?xml version="1.0"?>
<dwml version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http
://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://gra
phical.weather.gov/xml/DWMLgen/schema/DWML.xsd">
  <head>
    <product srsName="WGS 1984" concise-name="time-series" operational-mode="off
icial">
      <title>NOAA's National Weather Service Forecast Data</title>
      <field>meteorological</field>
      <category>forecast</category>
      <creation-date refresh-frequency="PT1H">2013-09-18T07:17:35Z</creation-dat
e>
    </product>
    <source>
      <more-information>http://graphical.weather.gov/xml/</more-information>
      <production-center>Meteorological Development Laboratory<sub-center>Produc
t Generation Branch</sub-center></production-center>
      <disclaimer>http://www.nws.noaa.gov/disclaimer.html</disclaimer>
      <credit>http://www.weather.gov/</credit>
      <credit-logo>http://www.weather.gov/images/xml_logo.gif</credit-logo>
      <feedback>http://www.weather.gov/feedback.php</feedback>
    </source>
  </head>
</dwml>

我想打印出创建日期属性值。我能够做到这一点的唯一方法是通过以下代码:

XElement xElement = XElement.Load(XmlReader.Create(new StringReader(xml)));
var nodes = xElement.Elements("head").Elements("product").Elements("creation-date");

foreach (var attr in nodes)
{
    Console.WriteLine("value = " + attr.Value);
}

我确信使用查询有更好的方法。我尝试使用select语句但无法在不进行某些操作的情况下使其正常工作。只需要一个查询而不必遍历结果集真的很好。

3 个答案:

答案 0 :(得分:2)

String output=xElement.Descendants("creation-date")
                   .Select(x=>x.Value).First();

答案 1 :(得分:0)

这将为您提供已解析的DateTime个对象的集合:

var dates = from cd in xdoc.Descendants("creation-date")
            select (DateTime)cd;

你可以枚举它们:

foreach(DateTime date in dates)
    Console.WriteLine(date);

此外,如果产品之外的其他元素可能包含创建日期,那么您可以使用以下XPath来选择产品的创建日期:

xdoc.XPathSelectElements("dwml/head/product/creation-date")

答案 2 :(得分:0)

您可以使用String.Join方法合并您的值:

Console.WriteLine(String.Join(Environment.NewLine, nodes.Select(x => (string)x)));

但要明确的是,无论如何它都会执行收集枚举。