c# - 使用 XmlDocument 从 XML 中提取数据

标签 c# .net xml

我正在使用 C# 中的天气 Web 服务。我正在传递它的 Lat-Long 并返回该区域的预测最高和最低温度。以下是我正在使用的代码

 var response = client.ndfdGen(latlong);
 XmlDocument doc = new XmlDocument();
 doc.LoadXml(response);

以下是我得到的响应数据,即 xml response 在这个响应中,有纬度和经度。 我必须提取这个

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
      <ns1:NDFDgenResponse xmlns:ns1="http://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl">
         <dwmlOut xsi:type="xsd:string"><![CDATA[<?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://www.nws.noaa.gov/forecasts/xml/DWMLgen/schema/DWML.xsd">
  <head>
    <product srsName="WGS 1984" concise-name="time-series" operational-mode="official">
      <title>NOAA's National Weather Service Forecast Data</title>
      <field>meteorological</field>
      <category>forecast</category>
      <creation-date refresh-frequency="PT1H">2015-04-15T15:13:07Z</creation-date>
    </product>
    <source>
      <more-information>http://www.nws.noaa.gov/forecasts/xml/</more-information>
      <production-center>Meteorological Development Laboratory<sub-center>Product 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>
  <data>
    <location>
      <location-key>point1</location-key>
      <point latitude="39.01" longitude="-77.02"/>
    </location>
    <moreWeatherInformation applicable-location="point1">http://forecast.weather.gov/MapClick.php?textField1=39.01&amp;textField2=-77.02</moreWeatherInformation>
    <time-layout time-coordinate="local" summarization="none">
      <layout-key>k-p24h-n2-1</layout-key>
      <start-valid-time>2015-04-17T08:00:00-04:00</start-valid-time>
      <end-valid-time>2015-04-17T20:00:00-04:00</end-valid-time>
      <start-valid-time>2015-04-18T08:00:00-04:00</start-valid-time>
      <end-valid-time>2015-04-18T20:00:00-04:00</end-valid-time>
    </time-layout>
    <parameters applicable-location="point1">
      <temperature type="maximum" units="Fahrenheit" time-layout="k-p24h-n2-1">
        <name>Daily Maximum Temperature</name>
        <value>68</value>
        <value>71</value>
      </temperature>
    </parameters>
  </data>
</dwml>]]></dwmlOut>
      </ns1:NDFDgenResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我想提取<time-layout time-coordinate="local" summarization="none">中的信息喜欢start-valid-time , end-valid-timetemperature来自 <temperature type="maximum" units="Fahrenheit" time-layout="k-p24h-n2-1">标签。

我怎样才能接触到这些节点并对其进行迭代?

最佳答案

您必须首先提取 CDATA,这确实是这里唯一的特殊挑战 - 然后您可以使用 XmlDocument 或 XDocument 或 XmlReader。我建议这样做:

var response = client.ndfdGen(latlong);
XDocument xd = null;

using (XmlReader xr = XmlReader.Create(new StringReader(response))) // load the response into an XmlReader
{
    xr.ReadToDescendant("dwmlOut"); // go to the dwmlOut node
    xr.Read(); // move to the CDATA in that node
    xd = XDocument.Parse(xr.Value); // load **that** XML into your XDocument
}

string startTime = xd.Descendants("start-valid-time").First().Value;

等等。

如果你坚持使用 XmlDocument,你可以在这里使用相同的方法,只需执行 XmlDocument.LoadFrom(xr.Value),但 XDocument API 更灵活一些,性能肯定会更好.

关于c# - 使用 XmlDocument 从 XML 中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29654218/

相关文章:

javascript - 在javascript中将xml中的 ' & '替换为 ' &amp; '

c# - native dll 的 .net 包装器 - 如何将运行时错误的风险降至最低?

c# - 在 ASP.NET MVC 应用程序中异步接收数据

c# - 我的类(class)有 30 个属性,单元测试很痛苦不是吗?

jQuery TABS 在新的 ASP .NET MVC4 项目下不工作

.net - 应该为批处理作业提供什么 HTTP 响应代码和 header ?

java - 如何从 Java 漂亮地打印 XML?

c# - 如何在C#中解析此xml?

c# - 在 Entity Framework 中动态传递 Select for projection 中的属性

c# - 如何删除数据 GridView 中的一行并在删除按钮单击事件时更新 MySQL 数据库?