代码之家  ›  专栏  ›  技术社区  ›  Dan R

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

  •  9
  • Dan R  · 技术社区  · 17 年前

    我正在序列化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();
    }
    
    6 回复  |  直到 12 年前
        1
  •  3
  •   p.campbell    12 年前

    下面的链接将带您到一个帖子,其中有人有一个方法通过使用xmlwriter来抑制处理指令,并进入“element”状态,而不是“start”状态。这会导致无法写入处理指令。

    Suppress Processing Instruction

    如果将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(); 
    

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

        2
  •  8
  •   JonF    16 年前

    我做了一个小小的修正

    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();
    }
    
        3
  •  7
  •   Marc Gravell    17 年前

    在2.0中,您将使用 XmLWriterSettings.OmitXmlDeclaration ,并序列化到XML编写器-但是我认为1.1中不存在这种情况;因此不存在 完全地 很有用-但还有一个“考虑升级”的东西…是的,我意识到这并不总是可能的。

        4
  •  1
  •   NetSide    16 年前

    省略名称空间怎么样?

    而不是使用

    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
  •  0
  •   harpo Binary Worrier    17 年前

    如果“处理指令”是指XML声明,那么可以通过设置xmlWriterSettings的omitxmlDeclaration属性来避免这种情况。要实现这一点,您需要使用一个XML编写器进行序列化。

    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
  •  0
  •   Cheeso    16 年前

    这在.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() { }
       }
    
    推荐文章