我希望能够将序列化的xml类加载到Soap Envelope中。我开始所以我没有填补内脏所以它看起来像:
<Envelope
xmlns="http://schemas.xmlsoap.org/soap/envelope/" />
我希望它看起来像:
<Envelope
xmlns="http://schemas.xmlsoap.org/soap/envelope/" ></Envelope>`
我写的课是这样的:
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.xmlsoap.org/soap/envelope/",ElementName="Envelope", IsNullable = true)]
public class TestXmlEnvelope
{
[System.Xml.Serialization.XmlElement(ElementName="Body", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
public System.Collections.ArrayList Body = new System.Collections.ArrayList();
} //class TestXmlEnvelope`
我使用它作为一个例子,因为其他人可能想要它在一个单独的元素中。我确信这一定很简单,但遗憾的是我不知道正确的关键字。
一如既往地感谢您的帮助。
[编辑]当我尝试使用此指令时出现错误
System.Xml.Serialization.XmlSerializer xmlout = new System.Xml.Serialization.XmlSerializer(typeof(TestXmlEnvelope));
System.IO.MemoryStream memOut = new System.IO.MemoryStream();
xmlout.Serialize(memOut, envelope, namespc);
Microsoft.Web.Services.SoapEnvelope soapEnv = new Microsoft.Web.Services.SoapEnvelope();
soapEnv.Load(memOut);
它给我错误“找不到根元素”。
[编辑]我修复了错误,问题是在我序列化了对象之后我没有设置memOut.Position = 0.我仍然希望这个问题可以帮助其他可能想要这样做的人。
答案 0 :(得分:11)
这里的主要问题是,XmlSerializer
会在WriteEndElement()
上调用XmlWriter
来编写结束标记。但是,当没有内容时,这会生成速记<tag/>
表单。 WriteFullEndElement()
分别编写结束标记。
您可以将自己的XmlTextWriter
注入到序列化程序用于展示该功能的中间位置。
鉴于serializer
是合适的XmlSerializer
,请尝试以下方法:
public class XmlTextWriterFull : XmlTextWriter
{
public XmlTextWriterFull(TextWriter sink) : base(sink) { }
public override void WriteEndElement()
{
base.WriteFullEndElement();
}
}
...
var writer = new XmlTextWriterFull(innerwriter);
serializer.Serialize(writer, obj);
[编辑]了解您添加的代码的情况,为:
添加外观构造函数public XmlTextWriterFull(Stream stream, Encoding enc) : base(stream, enc) { }
public XmlTextWriterFull(String str, Encoding enc) : base(str, enc) { }
然后,像以前一样在构造函数中使用内存流作为内部流:
System.IO.MemoryStream memOut = new System.IO.MemoryStream();
XmlTextWriterFull writer = new XmlTextWriterFull(memOut, Encoding.UTF8Encoding); //Or the encoding of your choice
xmlout.Serialize(writer, envelope, namespc);
答案 1 :(得分:1)
记录的注意事项:OP使用的是***Microsoft.***Web.Services.SoapEnvelope类,它是极为废弃的WSE 1.0产品的一部分。此类派生自XmlDocument类,因此XmlDocument可能会出现相同的问题。
在任何情况下都不应将WSE用于任何新开发,如果已经在使用,则应尽快迁移代码。 WCF或ASP.NET Web API是唯一应该用于.NET Web服务的技术。
答案 2 :(得分:-2)
这两个表示是等价的。为什么你需要它以后一种形式出现?