序列化对象时省略XML处理指令

Dan*_*n R 10 .net c# visual-studio-2003 xml-serialization

我正在C#VS2003/.Net 1.1应用程序中序列化一个对象.但是,我需要在没有处理指令的情况下进行序列化.XmlSerializer类推出类似这样的东西:

<?xml version="1.0" encoding="utf-16" ?> 
<MyObject>
    <Property1>Data</Property1>
    <Property2>More Data</Property2>
</MyObject>
Run Code Online (Sandbox Code Playgroud)

有没有办法得到类似下面的内容,而不处理生成的文本删除标签?

<MyObject>
    <Property1>Data</Property1>
    <Property2>More Data</Property2>
</MyObject>
Run Code Online (Sandbox Code Playgroud)

对于那些好奇的人,我的代码看起来像这样......

XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();

using ( TextWriter stringWriter = new StringWriter(builder) )
{
    serializer.Serialize(stringWriter, comments);
    return builder.ToString();
}
Run Code Online (Sandbox Code Playgroud)

小智 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();
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 7

在2.0中,您将使用XmLWriterSettings.OmitXmlDeclaration,并序列化为XmlWriter - 但我认为这不存在于1.1中; 所以并不完全有用 - 但只是再考虑一次"考虑升级"的事情......是的,我发现它并不总是可行的.


Dav*_*veK 3

以下链接将带您到一篇文章,其中有人提供了一种通过使用 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(); 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,写入器将处于“元素”状态(元素内部),因此不会写入任何处理指令。编写完 XML 后,您可以从底层流中提取文本并将其处理为您想要的内容。