我正在C#VS2003 / .Net 1.1应用程序中序列化一个对象。但是,我需要在没有处理指令的情况下进行序列化。 XmlSerializer类就是这样的:
<?xml version="1.0" encoding="utf-16" ?>
<MyObject>
<Property1>Data</Property1>
<Property2>More Data</Property2>
</MyObject>
有没有办法得到类似下面的内容,而不处理生成的文本以删除标记?
<MyObject>
<Property1>Data</Property1>
<Property2>More Data</Property2>
</MyObject>
对于那些好奇的人,我的代码看起来像这样......
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();
using ( TextWriter stringWriter = new StringWriter(builder) )
{
serializer.Serialize(stringWriter, comments);
return builder.ToString();
}
答案 0 :(得分:9)
我做了一个小小的修正
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();
}
答案 1 :(得分:7)
在2.0中,您将使用XmLWriterSettings.OmitXmlDeclaration,并序列化为XmlWriter - 但我认为这不存在于1.1中;所以不完全有用 - 但只是一个“考虑升级”的事情......是的,我意识到这并不总是可能的。
答案 2 :(得分:3)
以下链接将带您进入一个帖子,其中有人通过使用XmlWriter并进入“元素”状态而不是“开始”状态来抑制处理指令。这导致不写入处理指令。
Suppress Processing Instruction
如果将XmlWriter传递给序列化程序,它将只发出一个处理 指示XmlWriter的状态是否为“开始”(即没有任何东西 写到它)。
// 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();
在这种情况下,编写器将处于'Element'状态(在元素内) 所以不会写入处理指令。一个你写完了 XML,您可以从基础流中提取文本并将其处理到 你的内心。
答案 3 :(得分:1)
如何省略命名空间?
而不是使用
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add("", "");
例如:
<message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
答案 4 :(得分:0)
如果通过“处理指令”表示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。好吧,供其他人参考。
答案 5 :(得分:0)
这适用于.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() { }
}