为了账号安全,请及时绑定邮箱和手机立即绑定

C#-Soap如何从响应中获取值

C#-Soap如何从响应中获取值

C#
小唯快跑啊 2022-12-24 13:50:15
我正在开发 C# 控制台应用程序。我硬编码了一个 soap 请求,我在其中传递了 200 个唯一 ID,如下所示。要求<soapenv:Envelope     xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/""     xmlns:soap=""http://soap.inf.hexing.cn"">    <soapenv:Header/>    <soapenv:Body>      <soap:doCommand>         <!--Optional:-->         <arg0><![CDATA[<?xml version=""1.0"" encoding=""UTF-8""?>     <RequestMessage xmlns=""http://iec.ch/TC57/2011/schema/message""    xmlns:m=""http://iec.ch/TC57/2011/MeterReadSchedule#""     xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""    xsi:schemaLocation=""http://iec.ch/TC57/2011/schema/message Message.xsd"">    <Header>    <Verb>create</Verb>    <Noun>MeterReadSchedule</Noun>    <Revision>2.0</Revision>    <Timestamp>" + timestamp + @"</Timestamp>    <Source>Hesco</Source>    <AsyncReplyFlag>false</AsyncReplyFlag>    <ReplyAddress>" + hexURL + @"</ReplyAddress>    <AckRequired>false</AckRequired>    <User>      <UserID>"+userID+@"</UserID>    </User>    <MessageID>String</MessageID>    <CorrelationID>String</CorrelationID>    <Property>      <Name>password</Name>      <Value>"+pass+@"</Value>    </Property>    <Property>      <Name>timeout(h)</Name>      <Value>8</Value>    </Property>    </Header>    <Payload>    <m:MeterReadSchedule>      <m:EndDevice>        <m:mRID></m:mRID>        <Names>          <name>37010732575</name>        </Names>      </m:EndDevice>       <m:EndDevice>        <m:mRID></m:mRID>        <Names>          <name>37010719918</name>        </Names>      </m:EndDevice>               .        .        200 ID's                .        .       <m:EndDevice>        <m:mRID></m:mRID>        <Names>          <name>37030315780</name>        </Names>      </m:EndDevice>      <m:ReadingType>        <m:Names>          <m:name>MonthlyBilling</m:name>          <m:NameType>            <m:name>BillingType</m:name>          </m:NameType>        </m:Names>      </m:ReadingType>      <m:TimeSchedule>通过它后,我能够得到带有值的响应
查看完整描述

1 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

使用 xml linq。下面的代码从文件中读取并将结果放入字符串 xml 中。您的代码正在读取响应,应该将结果字符串转换为 xml


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Xml;

using System.Xml.Linq;

using System.IO;


namespace ConsoleApplication110

{

    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 mNs = root.GetNamespaceOfPrefix("m");


            List<XElement> xMeterReadings = doc.Descendants(mNs + "MeterReading").ToList();


            List<MeterReadings> meterReadings = new List<MeterReadings>();


            foreach (XElement xMeterReading in xMeterReadings)

            {

                MeterReadings newMeterReading = new MeterReadings();

                meterReadings.Add(newMeterReading);


                XElement valuesInterval = xMeterReading.Element(mNs + "valuesInterval");

                newMeterReading.start = (DateTime)valuesInterval.Element(mNs + "start");

                newMeterReading.end = (DateTime)valuesInterval.Element(mNs + "end");


                XElement meter = xMeterReading.Element(mNs + "Meter");


                newMeterReading.name = (string)meter.Descendants(mNs + "name").FirstOrDefault();

                newMeterReading.nameType = (string)meter.Descendants(mNs + "name").LastOrDefault();

                newMeterReading.mRid = (string)meter.Element(mNs + "mRID");


                List<XElement> xReadings = xMeterReading.Elements(mNs + "Readings").ToList();


                foreach (XElement xReading in xReadings)

                {

                    string readingType = (string)xReading.Element(mNs + "ReadingType").Attribute("ref");

                    ReadTypeEnum typeEnum = MeterReading.GetType(readingType);

                    if (typeEnum != ReadTypeEnum.NONE)

                    {


                        if (newMeterReading.meterReadings == null) newMeterReading.meterReadings = new List<MeterReading>();

                        MeterReading meterReading = new MeterReading();

                        newMeterReading.meterReadings.Add(meterReading);


                        meterReading.readingType = readingType;

                        meterReading.start = (DateTime)valuesInterval.Descendants(mNs + "start").FirstOrDefault();

                        meterReading.end = (DateTime)valuesInterval.Descendants(mNs + "end").FirstOrDefault();

                        meterReading.value = (decimal)xReading.Element(mNs + "value");

                        meterReading.timestamp = (DateTime)xReading.Element(mNs + "timeStamp");

                    }

                }


            }

        }

    }

    public enum ReadTypeEnum

    {

        KWH1,

        KVH1,

        MDI1,

        KWH2,

        KVH2,

        MDI2,

        NONE


    }

    public class MeterReadings

    {

        public DateTime start { get; set; }

        public DateTime end { get; set; }

        public string name { get; set; }

        public string nameType { get; set; }

        public string mRid { get; set; }


        public List<MeterReading> meterReadings { get; set; }

    }

    public class MeterReading

    {

        private ReadTypeEnum _readingType { get; set; }

        public string readingType

        {

            get

            {

                string readTypeStr = "";

                switch (_readingType)

                {

                    case ReadTypeEnum.KVH1:

                        readTypeStr = "13.26.0.1.1.1.12.0.0.0.0.1.0.0.224.3.72.0";

                        break;

                    case ReadTypeEnum.KVH2:

                        readTypeStr = "13.26.0.1.1.1.12.0.0.0.0.2.0.0.224.3.72.0";

                        break;

                    case ReadTypeEnum.KWH1:

                        readTypeStr = "13.26.0.1.1.1.12.0.0.0.0.1.0.0.224.3.73.0";

                        break;

                    case ReadTypeEnum.KWH2:

                        readTypeStr = "13.26.0.1.1.1.12.0.0.0.0.2.0.0.224.3.72.0";

                        break;

                    case ReadTypeEnum.MDI1:

                        readTypeStr = "13.8.0.6.1.1.8.0.0.0.0.1.0.0.224.3.38.0";

                        break;

                    case ReadTypeEnum.MDI2:

                        readTypeStr = "13.8.0.6.1.1.8.0.0.0.0.2.0.0.224.3.38.0";

                        break;

                }

                return readTypeStr;

            }

            set { _readingType = GetType(value); }


        }

        public DateTime start { get; set; }

        public DateTime end { get; set; }

        public DateTime timestamp { get; set; }

        public decimal value { get; set; }


        public static ReadTypeEnum GetType(string value)

        {

            ReadTypeEnum readTypeEnum;

            switch (value)

            {

                case "13.26.0.1.1.1.12.0.0.0.0.1.0.0.224.3.72.0":

                    readTypeEnum = ReadTypeEnum.KWH1;

                    break;


                case "13.26.0.1.1.1.12.0.0.0.0.2.0.0.224.3.72.0":

                    readTypeEnum = ReadTypeEnum.KVH2;

                    break;


                case "13.26.0.1.1.1.12.0.0.0.0.1.0.0.224.3.73.0":

                    readTypeEnum = ReadTypeEnum.KVH1;

                    break;


                case "13.26.0.1.1.1.12.0.0.0.0.2.0.0.224.3.73.0":

                    readTypeEnum = ReadTypeEnum.KVH2;

                    break;


                case "13.8.0.6.1.1.8.0.0.0.0.1.0.0.224.3.38.0":

                    readTypeEnum = ReadTypeEnum.MDI1;

                    break;


                case "13.8.0.6.1.1.8.0.0.0.0.2.0.0.224.3.38.0":

                    readTypeEnum = ReadTypeEnum.MDI2;

                    break;


                default:

                    readTypeEnum = ReadTypeEnum.NONE;

                    break;

            }

            return readTypeEnum;

        }

    }



}



查看完整回答
反对 回复 2022-12-24
  • 1 回答
  • 0 关注
  • 78 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信