【发布时间】:2020-09-23 06:19:27
【问题描述】:
当前反应
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header />
<s:Body>
<CreateCaseResponse xmlns="http://">
<CreateCaseResult>
<ErrorMessage>\n</ErrorMessage>
<Successful>true</Successful>
<CaseNumber></CaseNumber>
<Recno></Recno>
</CreateCaseResult>
</CreateCaseResponse>
</s:Body>
</s:Envelope>
在上面的响应中,CreateCaseResult 没有namespace,并且与下面的expected response 相比,数据成员(CaseNumber and Recno) 缺少prefix。
预期响应
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<CreateCaseResponse xmlns="">
<CreateCaseResult xmlns:a="" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ErrorDetails i:nil="true"/>
<ErrorMessage></ErrorMessage>
<Successful>true</Successful>
<a:CaseNumber></a:CaseNumber>
<a:Recno></a:Recno>
</CreateCaseResult>
</CreateCaseResponse>
</s:Body>
</s:Envelope>
序列化代码如下-
private static string MakeSerializedWithSoapEnvelope(object obj, string defaultNamespace)
{
var respFormat = @"
<s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/"">
<s:Header />
<s:Body>
{0}
</s:Body>
</s:Envelope>";
var serializer = new XmlSerializer(obj.GetType(), defaultNamespace);
var settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Indent = true;
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", defaultNamespace);
using (var stringWriter = new StringWriter())
{
using (var xmlWriter = XmlWriter.Create(stringWriter, settings))
{
serializer.Serialize(xmlWriter, obj, ns);
return string.Format(respFormat, stringWriter.ToString());
}
}
}
这里defaultNamespace 被传递为``。
请帮助我了解应该对代码进行哪些更改以获得desired and expected output/response.
提前致谢。
【问题讨论】:
-
序列化器自己并不知道对象中有多个命名空间需要序列化。您指定默认命名空间,这就是序列化程序添加到所有内容的内容。如果您需要在特定元素上使用更多命名空间,最好在类中定义要序列化的对象并将 xml 序列化信息添加到特定元素。
-
@martijn 我可以举个例子吗?
-
查看@jdweng 提供的答案。这将为您提供解决此问题所需的所有指导。
标签: c# xml serialization wsdl httpresponse