使用 linq 查询 xml
本文关键字:xml 查询 linq 使用 | 更新日期: 2023-09-27 18:31:48
所以我很难理解如何在 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 语句,但无法在不进行一些操作的情况下使其正常工作。只有一个查询而不必遍历结果集真的很好。
String output=xElement.Descendants("creation-date")
.Select(x=>x.Value).First();
这将为您提供解析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")
您可以使用String.Join
方法合并值:
Console.WriteLine(String.Join(Environment.NewLine, nodes.Select(x => (string)x)));
但需要明确的是,无论如何它都会执行集合枚举。