【问题标题】:Omitting XML processing instruction when serializing an object序列化对象时省略 XML 处理指令
【发布时间】:2010-09-14 22:36:31
【问题描述】:

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

【问题讨论】:

    标签: c# .net xml-serialization visual-studio-2003


    【解决方案1】:

    我做了一个小修正

    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】:

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

      【讨论】:

        【解决方案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(); 
        

        在这种情况下,写入器将处于“元素”状态(在元素内部) 所以不会写任何处理指令。一个你写完的 XML,您可以从底层流中提取文本并将其处理为 心满意足。

        【讨论】:

        • 但这仍然需要对结果进行后处理以删除 MyContainingElement 开始和结束标签,不是吗?虽然至少他们会被知道,所以这很好......
        • 我玩过这个并用 WriteRaw("") 替换了 WriteStartElement 并摆脱了 WriteEndElement - 然后我需要做的就是获得良好的输出是 TrimStart() 关闭 BOM。酷!
        【解决方案4】:

        省略命名空间怎么样?

        而不是使用

        XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
                        namespaces.Add("", "");
        

        例如:

        <message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
        
        【解决方案5】:

        如果“处理指令”是指 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 的问题。好吧,供其他人参考。

        【讨论】:

          【解决方案6】:

          这适用于 .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() { }
             }
          

          【讨论】:

            猜你喜欢
            • 2016-01-04
            • 1970-01-01
            • 1970-01-01
            • 2016-11-21
            • 1970-01-01
            • 2011-11-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多