【问题标题】:Read XML element that contains arrays from web service response从 Web 服务响应中读取包含数组的 XML 元素
【发布时间】:2019-03-14 07:03:22
【问题描述】:

我目前正在制作一个 Web 服务客户端(一个 C# Web 应用程序),它使用来自我的供应商的 Web 服务的数据。由于我不是程序员,这是我第一次处理 Web 服务,我从许多关于使用简单 Web 服务数据的教程中学习。但是我被困住了,我得到了一个数组中包含的值。

这是我可以从 SoapUI 等 SOAP 客户端获取的 XML 格式的 Web 服务响应:

    <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。您缺少所需的命名空间“a”。
  • 感谢您指出这一点。我想我在复制和粘贴时错过了它,但帖子已经过编辑以包含它。

标签: c# xml webservice-client


【解决方案1】:

使用 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; }
    }

}

【讨论】:

  • 感谢您的回答,但如果 xml 是来自 Web 服务的响应,我可以知道我的 xml 文件名应该是什么吗?
  • 这就是我将文件读入字符串的原因。您来自 Web 服务的响应是一个字符串,因此您不需要从文件中读取。只需使用 Parse 方法将字符串转换为 XDocument。
猜你喜欢
  • 1970-01-01
  • 2012-09-23
  • 2012-07-05
  • 2015-11-26
  • 2020-04-23
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多