我序列化的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();
}
下面的链接将带你到一个帖子里有人通过使用的XmlWriter和进入的“元素”的状态,而不是一个“开始”状态supressing处理指令的方法。 这将导致不能写入的处理指令。
禁止处理指令
如果你传递一个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();
在这种情况下,写入器将在“元素”(元件内部)的状态所以没有处理指令将被写入。 一,你写完了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("", "");
例如:
<message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
如果“处理指令”你的意思是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() { }
}