2011-04-11 53 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

相关问题