我目前正在制作一个Web服务客户端(一个C#Web应用程序),它使用我供应商的Web服务中的数据。由于我不是程序员,这是我第一次处理Web服务,因此我从很多关于使用简单Web服务数据的教程中学到了很多东西。但是我被卡住了,我得到了数组中包含的值。
这是XML格式的Web服务响应,我可以从SOAP客户端获取,如SoapUI:
<GetSiteDataResponse xmlns="http://tempuri.org/">
<SiteDataResult
xmlns:a="http://schemas.datacontract.org/2004/07/KPIService"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:SiteName>PMU88</a:SiteName>
<a:SiteLocation>EcoHill</a:SiteLocation>
<a:SiteData>
<a:DateIntervalNode>
<a:Date>2019-01-01</a:Date>
<a:Temperature>
<a:TemperatureNode>
<a:AverageTemperature>35</a:AverageTemperature>
<a:Unit>C</a:Unit>
</a:TemperatureNode>
</a:Temperature>
</a:DateIntervalNode>
<a:DateIntervalNode>
<a:Date>2019-01-02</a:Date>
<a:Temperature>
<a:TemperatureNode>
<a:AverageTemperature>32</a:AverageTemperature>
<a:Unit>C</a:Unit>
</a:TemperatureNode>
</a:Temperature>
</a:DateIntervalNode>
</a:SiteData>
</SiteDataResult>
</GetSiteDataResponse>
要在Web应用程序中使用Web服务数据,我在Web应用程序中添加了一个链接到Web服务WSDL的服务引用。结果参数将在网页中显示为标签。这是我的代码背后:
public partial class SiteTemp : System.Web.UI.Page
{
protected void btnInvoke_Click1(object sender, EventArgs e)
{
ServiceReference1.siteTemperatureData myWebService = new ServiceReference1.siteTemperatureDataClient();
string username = "user1";
string password = "mypassword";
string siteID = "1104";
lblSiteName.Text = myWebService.GetSiteData(username, password, siteID).SiteName;
lblSiteLocation.Text = myWebService.GetSiteData(username, password, siteID).SiteLocation;
lblDate1.Text = ???
lblTemperature1.Text = ???
lblUnit1.Text = ???
lblDate2.Text = ???
lblTemperature2.Text = ???
lblUnit2.Text = ???
}
}
我可以获取SiteName和SiteLocation的值,但我不知道如何获取Date,AverageTemperature和Unit的值,因为'SiteData'的元素类型是一个数组,我必须进一步向下层次结构以获取我的数据需要。在大多数相关的线程中,我可以看到人们如何从数组中获取值。在我的情况下,数组中也有数组。任何帮助/线索/提示都非常感谢。
使用Xml Linq:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication106
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
string xml = File.ReadAllText(FILENAME);
XDocument doc = XDocument.Parse(xml);
XElement root = doc.Root;
XNamespace ns = root.GetDefaultNamespace();
XElement siteDataResult = doc.Descendants(ns + "SiteDataResult").FirstOrDefault();
XNamespace aNs = siteDataResult.GetNamespaceOfPrefix("a");
Site site = new Site();
site.siteName = (string)siteDataResult.Element(aNs + "SiteName");
site.siteLocation = (string)siteDataResult.Element(aNs + "SiteLocation");
site.dict = siteDataResult.Descendants(aNs + "DateIntervalNode")
.GroupBy(x => (DateTime)x.Element(aNs + "Date"), y => new KeyValuePair<int, string>(
(int)y.Descendants(aNs + "AverageTemperature").FirstOrDefault(),
(string)y.Descendants(aNs + "Unit").FirstOrDefault()
)
)
.ToDictionary(x => x.Key, y => y.FirstOrDefault());
}
}
public class Site
{
public string siteName { get; set; }
public string siteLocation { get; set; }
public Dictionary<DateTime, KeyValuePair<int, string>> dict { get; set; }
}
}