2011-04-11 72 views
1

我有一個xml API,必須模擬字符。我試圖在.NET中使用內置的xml序列化功能,但它增加了一些額外的屬性。在NORMAL Web服務或xml API中,這些屬性不會損害任何內容,甚至可能達到目的。但他們是意想不到的角色,不幸的是,我不能允許他們。因此,這裏是我想要做什麼(當然,假設對象):序列化不帶類型和名稱空間屬性的派生類型

我有一個基本類型

public abstract class Instrument { }

...我有一個派生類

public class Guitar : Instrument { }

...我想派生類型序列化到這樣的事情:

<Guitar />

相反,我得到這樣的:

<Instrument d1p1:type="Guitar" xmlns:d1p1="http://www.w3.org/2001/XMLSchema-instance" />

這是一個測試我的工作:

[TestClass] 
public class when_serializing_a_guitar 
{ 
    private XmlSerializer _serializer; 
    private string _expectedXml; 
    private StringWriter _stringWriter; 
    private string _actualXml; 
    private XmlSerializerNamespaces _ns; 
    private XmlWriter _xmlWriter; 

    private void WithThisContext() 
    { 
     _ns = new XmlSerializerNamespaces(); 
     _ns.Add("", ""); 

     _stringWriter = new StringWriter(); 
     _xmlWriter = XmlWriter.Create(_stringWriter, new XmlWriterSettings 
                 { 
                  OmitXmlDeclaration = true, 
                  CloseOutput = false 
                 }); 

     _serializer = new XmlSerializer(typeof(Instrument), new[] { typeof(Guitar) }); 

     _expectedXml = @"<Guitar />"; 
    } 

    private void BecauseOfThisAction() 
    { 
     _serializer.Serialize(_xmlWriter, new Guitar(), _ns); 
     _actualXml = _stringWriter.ToString(); 
    } 

    [TestMethod] 
    public void it_should_return_the_expected_properly_formatted_xml() 
    { 
     WithThisContext(); 
     BecauseOfThisAction(); 
     Assert.AreEqual(_expectedXml, _actualXml); 
    } 
} 

知道我能做到這一點?

回答

1

我假設您需要保持域模型層次結構不變。否則,你可以這樣做:var serializer = new XmlSerializer(typeof(Guitar));

如果您確實需要保持它完好,建議您在每個域對象上編寫自己的ToXml方法。

public interface IXmlWritable 
{ 
    string ToXml(); 
} 

public class Instrument : IXmlWritable 
{ 
    public string classification { get; set; } 

    public string ToXml() 
    { 
     return "<Instrument classification='" + classification + "' />"; 
    } 
} 

或類似的東西,取決於你想如何遍歷節點。

0

您可以使用System.Xml.Linq中的XElement(您需要使用'add reference'添加對它的引用)。這是簡單地創建一個乾淨的XML文檔的代碼:

XElement el = new XElement("data", new XElement("guitar")); 

el.Save(@"D:\test.xml", SaveOptions.None); 
+0

吉他和樂器只是簡單的例子。真正的對象要複雜得多。這裏的對象是序列化一個對象到XML ...不僅僅是爲了創建一個XML節點。 – 2011-04-11 13:59:07

相關問題