SOAP XML选择节点

时间:2018-07-05 15:03:32

标签: c# xml soap

我正在尝试获取C#对象中的SOAP XML值,但是目前我无法选择任何节点,因此没有任何值。

这是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的值?

谢谢和亲切的问候, 克里斯

2 个答案:

答案 0 :(得分:0)

以我的经验,通过网络发出的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;

希望有帮助。

答案 1 :(得分:0)

非常感谢。现在,我可以输入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中的字符错误”