我正在尝试获取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的值?
谢谢和亲切的问候, 克里斯
答案 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><Parameter>
<DataType>String</DataType>
<Name>WebResponse</Name>
<Value>HalloChristian</Value>
</Parameter></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中的字符错误”