序列化对象时,省略XML处理指令(Omitting XML processing instructi

2019-09-02 08:25发布

我序列化的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();
}

Answer 1:

下面的链接将带你到一个帖子里有人通过使用的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,你可以提取底层流的文本,它处理你的心脏的内容。



Answer 2:

我做了一个小的修正

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


Answer 3:

在2.0中,你可以使用XmLWriterSettings.OmitXmlDeclaration ,并序列化为XmlWriter的-但是我不认为这存在于1.1; 所以不是完全有用-只是多了一个“考虑升级”的事情......是的,我知道这是不可能的。



Answer 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\">


Answer 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。 那么,对于参考他人。



Answer 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() { }
   }


文章来源: Omitting XML processing instruction when serializing an object