2008-10-02 62 views
9

我在C#VS2003/.Net 1.1應用程序中序列化對象。但是,我需要它沒有處理指令序列化。 XmlSerializer類拿出這樣的:序列化對象時省略XML處理指令

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

回答

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後,您可以從基礎流中提取文本並將其處理爲您心中的內容 。

+1

但是,這仍然需要後期處理的結果,除去MyContainingElement開始和結束標記,不是嗎? 儘管至少他們將被稱爲,所以這是很好的... – 2008-10-02 23:40:46

+1

我玩這個並用WriteRaw(「」)替換WriteStartElement並擺脫了WriteEndElement - 然後我需要做的所有事情都是爲了獲得好的輸出TrimStart() BOM關閉。涼! – 2008-10-03 00:27:40

7

在2.0中,你可以使用XmLWriterSettings.OmitXmlDeclaration,並序列化爲XmlWriter的 - 但是我不認爲這存在在1.1;所以不是完全有用 - 但只有一個「考慮升級」的事情......是的,我意識到這並非總是可能的。

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。那麼,以供參考。

8

我做了一個小的修正

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

感謝您發佈更正:o) – Andrew 2010-01-29 12:29:41

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