10

我在 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();
}
4

6 回答 6

10

我做了一个小修正

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();
}
于 2008-11-26T20:47:05.900 回答
7

在 2.0 中,您将使用XmLWriterSettings.OmitXmlDeclaration并序列化为 XmlWriter - 但是我认为这在 1.1 中不存在;所以并不完全有用 - 但只是一件“考虑升级”的事情......是的,我意识到这并不总是可能的。

于 2008-10-02T21:03:52.387 回答
3

以下链接将带您到一个帖子,其中有人有一种方法可以通过使用 XmlWriter 并进入“元素”状态而不是“开始”状态来抑制处理指令。这导致处理指令不被写入。

抑制处理指令

如果您将 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 的编写,您就可以从底层流中提取文本并将其处理成您想要的内容。

于 2008-10-02T21:06:02.600 回答
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\">
于 2009-03-09T11:48:30.883 回答
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 的问题。好吧,供其他人参考。

于 2008-10-02T21:05:01.527 回答
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() { }
   }
于 2009-02-26T10:51:17.617 回答