นี่คือคำตอบที่ 2 จากสองคำตอบ
หากคุณต้องการเพียงแค่ตัดเนมสเปซทั้งหมดออกจากเอกสารโดยพลการระหว่างการทำให้เป็นอนุกรมคุณสามารถทำได้โดยใช้ XmlWriter ของคุณเอง
วิธีที่ง่ายที่สุดคือการได้มาจาก XmlTextWriter และแทนที่เมธอด StartElement ที่ปล่อยเนมสเปซ เมธอด StartElement ถูกเรียกใช้โดย XmlSerializer เมื่อปล่อยองค์ประกอบใด ๆ รวมทั้งรูท การลบล้างเนมสเปซสำหรับแต่ละองค์ประกอบและแทนที่ด้วยสตริงว่างหมายความว่าคุณได้ลอกเนมสเปซออกจากเอาต์พุต
public class NoNamespaceXmlWriter : XmlTextWriter
{
public NoNamespaceXmlWriter(System.IO.TextWriter output)
: base(output) { Formatting= System.Xml.Formatting.Indented;}
public override void WriteStartDocument () { }
public override void WriteStartElement(string prefix, string localName, string ns)
{
base.WriteStartElement("", localName, "");
}
}
สมมติว่านี่คือประเภท:
[XmlRoot(Namespace="urn:Abracadabra")]
public class MyTypeWithNamespaces
{
private int _Epoch;
private string _Label;
[XmlElement(Namespace="urn:Whoohoo")]
public string Label
{
set { _Label= value; }
get { return _Label; }
}
public int Epoch
{
set { _Epoch= value; }
get { return _Epoch; }
}
}
นี่คือวิธีที่คุณจะใช้สิ่งดังกล่าวในระหว่างการทำให้เป็นอนุกรม:
var o2= new MyTypeWithNamespaces { ..intializers.. };
var builder = new System.Text.StringBuilder();
using ( XmlWriter writer = new NoNamespaceXmlWriter(new System.IO.StringWriter(builder)))
{
s2.Serialize(writer, o2, ns2);
}
Console.WriteLine("{0}",builder.ToString());
XmlTextWriter เป็นประเภทที่เสียแม้ว่า ตามเอกสารอ้างอิงเมื่อเขียนจะไม่ได้ตรวจสอบสิ่งต่อไปนี้:
อักขระไม่ถูกต้องในชื่อแอตทริบิวต์และองค์ประกอบ
อักขระ Unicode ที่ไม่พอดีกับการเข้ารหัสที่ระบุ หากอักขระ Unicode ไม่พอดีกับการเข้ารหัสที่ระบุ XmlTextWriter จะไม่หลบหนีอักขระ Unicode ไปเป็นเอนทิตีอักขระ
แอตทริบิวต์ที่ซ้ำกัน
อักขระในตัวระบุสาธารณะ DOCTYPE หรือตัวระบุระบบ
ปัญหาเหล่านี้กับ XmlTextWriter เกิดขึ้นตั้งแต่ v1.1 ของ. NET Framework และจะยังคงอยู่เพื่อความเข้ากันได้แบบย้อนหลัง หากคุณไม่มีความกังวลเกี่ยวกับปัญหาเหล่านั้นให้ใช้ XmlTextWriter แต่คนส่วนใหญ่ต้องการความน่าเชื่อถือมากขึ้นเล็กน้อย
เพื่อให้ได้สิ่งนั้นในขณะที่ยังคงระงับเนมสเปซระหว่างการทำให้เป็นอนุกรมแทนที่จะหามาจาก XmlTextWriter ให้กำหนดการใช้งานXmlWriterแบบนามธรรมและ 24 วิธีอย่าง เป็นรูปธรรม
ตัวอย่างอยู่ที่นี่:
public class XmlWriterWrapper : XmlWriter
{
protected XmlWriter writer;
public XmlWriterWrapper(XmlWriter baseWriter)
{
this.Writer = baseWriter;
}
public override void Close()
{
this.writer.Close();
}
protected override void Dispose(bool disposing)
{
((IDisposable) this.writer).Dispose();
}
public override void Flush()
{
this.writer.Flush();
}
public override string LookupPrefix(string ns)
{
return this.writer.LookupPrefix(ns);
}
public override void WriteBase64(byte[] buffer, int index, int count)
{
this.writer.WriteBase64(buffer, index, count);
}
public override void WriteCData(string text)
{
this.writer.WriteCData(text);
}
public override void WriteCharEntity(char ch)
{
this.writer.WriteCharEntity(ch);
}
public override void WriteChars(char[] buffer, int index, int count)
{
this.writer.WriteChars(buffer, index, count);
}
public override void WriteComment(string text)
{
this.writer.WriteComment(text);
}
public override void WriteDocType(string name, string pubid, string sysid, string subset)
{
this.writer.WriteDocType(name, pubid, sysid, subset);
}
public override void WriteEndAttribute()
{
this.writer.WriteEndAttribute();
}
public override void WriteEndDocument()
{
this.writer.WriteEndDocument();
}
public override void WriteEndElement()
{
this.writer.WriteEndElement();
}
public override void WriteEntityRef(string name)
{
this.writer.WriteEntityRef(name);
}
public override void WriteFullEndElement()
{
this.writer.WriteFullEndElement();
}
public override void WriteProcessingInstruction(string name, string text)
{
this.writer.WriteProcessingInstruction(name, text);
}
public override void WriteRaw(string data)
{
this.writer.WriteRaw(data);
}
public override void WriteRaw(char[] buffer, int index, int count)
{
this.writer.WriteRaw(buffer, index, count);
}
public override void WriteStartAttribute(string prefix, string localName, string ns)
{
this.writer.WriteStartAttribute(prefix, localName, ns);
}
public override void WriteStartDocument()
{
this.writer.WriteStartDocument();
}
public override void WriteStartDocument(bool standalone)
{
this.writer.WriteStartDocument(standalone);
}
public override void WriteStartElement(string prefix, string localName, string ns)
{
this.writer.WriteStartElement(prefix, localName, ns);
}
public override void WriteString(string text)
{
this.writer.WriteString(text);
}
public override void WriteSurrogateCharEntity(char lowChar, char highChar)
{
this.writer.WriteSurrogateCharEntity(lowChar, highChar);
}
public override void WriteValue(bool value)
{
this.writer.WriteValue(value);
}
public override void WriteValue(DateTime value)
{
this.writer.WriteValue(value);
}
public override void WriteValue(decimal value)
{
this.writer.WriteValue(value);
}
public override void WriteValue(double value)
{
this.writer.WriteValue(value);
}
public override void WriteValue(int value)
{
this.writer.WriteValue(value);
}
public override void WriteValue(long value)
{
this.writer.WriteValue(value);
}
public override void WriteValue(object value)
{
this.writer.WriteValue(value);
}
public override void WriteValue(float value)
{
this.writer.WriteValue(value);
}
public override void WriteValue(string value)
{
this.writer.WriteValue(value);
}
public override void WriteWhitespace(string ws)
{
this.writer.WriteWhitespace(ws);
}
public override XmlWriterSettings Settings
{
get
{
return this.writer.Settings;
}
}
protected XmlWriter Writer
{
get
{
return this.writer;
}
set
{
this.writer = value;
}
}
public override System.Xml.WriteState WriteState
{
get
{
return this.writer.WriteState;
}
}
public override string XmlLang
{
get
{
return this.writer.XmlLang;
}
}
public override System.Xml.XmlSpace XmlSpace
{
get
{
return this.writer.XmlSpace;
}
}
}
จากนั้นจัดเตรียมคลาสที่ได้รับมาซึ่งแทนที่เมธอด StartElement เหมือนเดิม:
public class NamespaceSupressingXmlWriter : XmlWriterWrapper
{
public NamespaceSupressingXmlWriter(System.IO.TextWriter output)
: base(XmlWriter.Create(output)) { }
public NamespaceSupressingXmlWriter(XmlWriter output)
: base(XmlWriter.Create(output)) { }
public override void WriteStartElement(string prefix, string localName, string ns)
{
base.WriteStartElement("", localName, "");
}
}
จากนั้นใช้นักเขียนคนนี้ดังนี้:
var o2= new MyTypeWithNamespaces { ..intializers.. };
var builder = new System.Text.StringBuilder();
var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Indent= true };
using ( XmlWriter innerWriter = XmlWriter.Create(builder, settings))
using ( XmlWriter writer = new NamespaceSupressingXmlWriter(innerWriter))
{
s2.Serialize(writer, o2, ns2);
}
Console.WriteLine("{0}",builder.ToString());
สินเชื่อเพื่อการนี้เพื่อOleg Tkachenko