序列化对象时省略XML处理指令
我正在C#VS2003 / .Net 1.1应用程序中序列化一个对象。 但是,我需要在没有处理指令的情况下进行序列化。 XmlSerializer类推出类似这样的东西:
Data More Data
有没有办法得到类似下面的东西,而不处理结果文本删除标签?
Data More Data
对于那些好奇的人,我的代码看起来像这样……
XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); StringBuilder builder = new StringBuilder(); using ( TextWriter stringWriter = new StringWriter(builder) ) { serializer.Serialize(stringWriter, comments); return builder.ToString(); }
以下链接将带您到一个post,其中有人通过使用XmlWriter并进入“元素”状态而不是“开始”状态来抑制处理指令。 这导致不写入处理指令。
抑制处理指令
如果将XmlWriter传递给序列化程序,如果XmlWriter的状态为“Start”(即尚未写入任何内容),它将仅发出处理指令。
// Assume we have a type named 'MyType' and a variable of this type named 'myObject' System.Text.StringBuilder output = new System.Text.StringBuilder(); System.IO.StringWriter internalWriter = new System.IO.StringWriter(output); System.Xml.XmlWriter writer = new System.Xml.XmlTextWriter(internalWriter); System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(MyType)); writer.WriteStartElement("MyContainingElement"); serializer.Serialize(writer, myObject); writer.WriteEndElement();
在这种情况下,编写器将处于“元素”状态(在元素内),因此不会写入处理指令。 在编写XML之后,您可以从基础流中提取文本并将其处理到您的内容。
我做了一个小小的修正
XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); StringBuilder builder = new StringBuilder(); XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; using ( XmlWriter stringWriter = XmlWriter.Create(builder, settings) ) { serializer.Serialize(stringWriter, comments); return builder.ToString(); }
在2.0中,您将使用XmLWriterSettings.OmitXmlDeclaration ,并序列化为XmlWriter – 但我认为这不存在于1.1中; 所以并不完全有用 – 但只是再考虑“升级”的事情……是的,我意识到这并不总是可行的。
如何省略命名空间?
而不是使用
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); namespaces.Add("", "");
例如:
如果通过“处理指令”表示xml声明,则可以通过设置XmlWriterSettings的OmitXmlDeclaration属性来避免这种情况。 您需要使用XmlWriter进行序列化才能完成此任务。
XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); StringBuilder builder = new StringBuilder(); XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; using ( XmlWriter stringWriter = new StringWriter(builder, settings) ) { serializer.Serialize(stringWriter, comments); return builder.ToString(); }
但啊,这不能回答你的问题1.1。 好吧,供别人参考。
这适用于.NET 1.1。 (但你还是应该考虑升级)
XmlSerializer s1= new XmlSerializer(typeof(MyClass)); XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add( "", "" ); MyClass c= new MyClass(); c.PropertyFromDerivedClass= "Hallo"; sw = new System.IO.StringWriter(); s1.Serialize(new XTWND(sw), c, ns); .... /// XmlTextWriterFormattedNoDeclaration /// helper class : eliminates the XML Documentation at the /// start of a XML doc. /// XTWFND = XmlTextWriterFormattedNoDeclaration public class XTWFND : System.Xml.XmlTextWriter { public XTWFND(System.IO.TextWriter w) : base(w) { Formatting = System.Xml.Formatting.Indented; } public override void WriteStartDocument() { } }