Узлы выбора SOAP XML

Я пытаюсь получить значения SOAP XML в объектах C#, но в настоящее время я не могу выбрать какой-либо узел и поэтому не получаю значения.

Это XML:

<?xml version = "1.0" encoding = "utf-8"?><soap:Envelope xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/2001/XMLSchema" xmlns:soap = "http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<AddTwoStr xmlns = "http://cpu1147/AB_TestWebApp/">
<InputParameters>
<Parameter>
<DataType>string</DataType>
<Name>String1</Name>
<Value>test</Value>
</Parameter>
<Parameter>
<DataType>string</DataType>
<Name>String2</Name>
<Value>test</Value
></Parameter>
</InputParameters>
</AddTwoStr>
</soap:Body>
</soap:Envelope>

XML хранится в следующем коде C#:

// Get raw request body
            Stream receiveStream = HttpContext.Current.Request.InputStream;
            // Move to begining of input stream and read
            receiveStream.Position = 0;
            //Webrequest als StreamReader
            //StreamReader mystream = new StreamReader(receiveStream, Encoding.UTF8);
            StreamReader mystream = new StreamReader(receiveStream);

            string test = mystream.ReadToEnd();

            XmlDocument document = new XmlDocument();
            document.LoadXml(test);

Есть ли у меня решение для выбора значений String1 и String2 ??

Спасибо и добрые пожелания, Крис

Вы говорите, что не получаете никакой ценности .... С какой ошибкой / проблемой вы столкнулись?

Wheels73 05.07.2018 17:08

String 1 и String2 сами по себе являются значениями в приведенном выше XML. вы можете указать, какие значения тегов вам нужны?

Prany 05.07.2018 17:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
445
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

По моему опыту, запросы SOAP, которые поступают по сети, десериализуются в известные типы, которые обычно предоставляются справочной информацией потребляемых сервисов, которая генерируется при добавлении ссылки на сервис. Я понимаю, что вы потенциально можете получать эту полезную нагрузку откуда-то еще, но мне по-прежнему часто проще использовать строго типизированные классы для извлечения нужных вам значений. Конечно, вы можете загрузить XML в документ XPath или что-то в этом роде и пройти по узлам и элементам внутри.

В приведенном ниже примере я взял ваш xml и создал классы, необходимые для десериализации.

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.xmlsoap.org/soap/envelope/", IsNullable = false)]
    public partial class Envelope
    {

        private EnvelopeBody bodyField;

        /// <remarks/>
        public EnvelopeBody Body
        {
            get
            {
                return this.bodyField;
            }
            set
            {
                this.bodyField = value;
            }
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
    public partial class EnvelopeBody
    {

        private AddTwoStr addTwoStrField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://cpu1147/AB_TestWebApp/")]
        public AddTwoStr AddTwoStr
        {
            get
            {
                return this.addTwoStrField;
            }
            set
            {
                this.addTwoStrField = value;
            }
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://cpu1147/AB_TestWebApp/")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://cpu1147/AB_TestWebApp/", IsNullable = false)]
    public partial class AddTwoStr
    {

        private AddTwoStrParameter[] inputParametersField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("Parameter", IsNullable = false)]
        public AddTwoStrParameter[] InputParameters
        {
            get
            {
                return this.inputParametersField;
            }
            set
            {
                this.inputParametersField = value;
            }
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://cpu1147/AB_TestWebApp/")]
    public partial class AddTwoStrParameter
    {

        private string dataTypeField;

        private string nameField;

        private string valueField;

        /// <remarks/>
        public string DataType
        {
            get
            {
                return this.dataTypeField;
            }
            set
            {
                this.dataTypeField = value;
            }
        }

        /// <remarks/>
        public string Name
        {
            get
            {
                return this.nameField;
            }
            set
            {
                this.nameField = value;
            }
        }

        /// <remarks/>
        public string Value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = value;
            }
        }
    }

Затем мы используем XMLSerializer для десериализации xml в экземпляр класса. В приведенном ниже примере я загрузил ваш xml из локального файла.

Envelope data;
var xml = File.ReadAllText(@"C:\test.xml");

 using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
 {
      XmlSerializer serializer = new XmlSerializer(typeof(Envelope));
      data = (Envelope)serializer.Deserialize(stream);
 }

 //Access the parameters here via an index.
 var val = data.Body.AddTwoStr.InputParameters[0].Value;

Надеюсь, это поможет.

Большое спасибо, что помогает. Теперь я могу ввести XML. Следующий вопрос - это ответ. Я должен установить его как XML и попробовать следующее

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.IO;
using System.Xml;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap;
using System.Web.Script.Services;
using System.Xml.Serialization;

namespace AB_TestWebApp
{
    /// <summary>
    /// Zusammenfassungsbeschreibung für WebService1
    /// </summary>
    [WebService(Namespace = "http://cpu1147/AB_TestWebApp/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(true)]
    // Wenn der Aufruf dieses Webdiensts aus einem Skript zulässig sein soll, heben Sie mithilfe von ASP.NET AJAX die Kommentarmarkierung für die folgende Zeile auf. 
    [System.Web.Script.Services.ScriptService]
    public class WebService1 : System.Web.Services.WebService
    {


        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Xml)]
        public string AddTwoStr()
        {
            //--//
            // Get raw request body
            Stream receiveStream = HttpContext.Current.Request.InputStream;
            // Move to begining of input stream and read
            receiveStream.Position = 0;
            //Webrequest als StreamReader
            //StreamReader mystream = new StreamReader(receiveStream, Encoding.UTF8);
            //StreamReader mystream = new StreamReader(receiveStream);

            //string test = mystream.ReadToEnd();

            //XmlDocument document = new XmlDocument();
            //document.LoadXml(test);
            //XElement xdocument = XElement.Parse(test);

            Envelope data;
            //var xml = document.Value;

            //using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(receiveStream.ToString())))
            using (StreamReader stream = new StreamReader(receiveStream, Encoding.UTF8))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Envelope));
                data = (Envelope)serializer.Deserialize(stream);
            }

            //Access the parameters here via an index.
            string String1 = data.Body.AddTwoStr.InputParameters[0].Value;
            string String2 = data.Body.AddTwoStr.InputParameters[1].Value;

            //--//

            XElement sofon_response = new XElement("Parameter",
            new XElement("DataType", "String"),
            new XElement("Name", "WebResponse"),
            new XElement("Value", string.Concat(String1, String2))
            );

            return sofon_response.ToString();
        }


        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }


        [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
        [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.xmlsoap.org/soap/envelope/", IsNullable = false)]
        public partial class Envelope
        {

            private EnvelopeBody bodyField;

            /// <remarks/>
            public EnvelopeBody Body
            {
                get
                {
                    return this.bodyField;
                }
                set
                {
                    this.bodyField = value;
                }
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
        public partial class EnvelopeBody
        {

            private AddTwoStrPar addTwoStrField;

            /// <remarks/>
            [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://cpu1147/AB_TestWebApp/")]
            public AddTwoStrPar AddTwoStr
            {
                get
                {
                    return this.addTwoStrField;
                }
                set
                {
                    this.addTwoStrField = value;
                }
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://cpu1147/AB_TestWebApp/")]
        [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://cpu1147/AB_TestWebApp/", IsNullable = false)]
        public partial class AddTwoStrPar
        {

            private AddTwoStrParameter[] inputParametersField;

            /// <remarks/>
            [System.Xml.Serialization.XmlArrayItemAttribute("Parameter", IsNullable = false)]
            public AddTwoStrParameter[] InputParameters
            {
                get
                {
                    return this.inputParametersField;
                }
                set
                {
                    this.inputParametersField = value;
                }
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://cpu1147/AB_TestWebApp/")]
        public partial class AddTwoStrParameter
        {

            private string dataTypeField;

            private string nameField;

            private string valueField;

            /// <remarks/>
            public string DataType
            {
                get
                {
                    return this.dataTypeField;
                }
                set
                {
                    this.dataTypeField = value;
                }
            }

            /// <remarks/>
            public string Name
            {
                get
                {
                    return this.nameField;
                }
                set
                {
                    this.nameField = value;
                }
            }

            /// <remarks/>
            public string Value
            {
                get
                {
                    return this.valueField;
                }
                set
                {
                    this.valueField = value;
                }
            }
        }
    }
}

Моя проблема сейчас в том, что XML теперь плохо отформатирован, см. Этот пример:

<?xml version = "1.0" encoding = "utf-8"?><soap:Envelope xmlns:soap = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/2001/XMLSchema"><soap:Body><AddTwoStrResponse xmlns = "http://cpu1147/AB_TestWebApp/"><AddTwoStrResult>&lt;Parameter&gt;
  &lt;DataType&gt;String&lt;/DataType&gt;
  &lt;Name&gt;WebResponse&lt;/Name&gt;
  &lt;Value&gt;HalloChristian&lt;/Value&gt;
&lt;/Parameter&gt;</AddTwoStrResult></AddTwoStrResponse></soap:Body></soap:Envelope>

Что мне нужно вернуть, так это то, что:

<?xml version = "1.0" encoding = "utf-8"?>
<soap:Envelope xmlns:soap = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <WebMethodResponse xmlns = "http://tempuri.org/">
            <WebMethodResult>
                <Parameter>
                    <DataType>String</DataType>
                    <Name>WebResponse</Name>
                    <Value>Hallo World</Value>
                </Parameter>
            </WebMethodResult>
        </WebMethodResponse>
        <soap:Fault>
            <faultcode/>
            <faultstring/>
            <faultactor/>
            <detail/>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

Я пробовал десериализовать сервал раз, но всегда получаю сообщение об ошибке «неправильный символ в XML»

Другие вопросы по теме