序列化为 XML 删除命名空间,xml 定义等

Serialize to XML removing namespaces, xml definition and so on

我必须使用 ServiceStack.Text.XmlSerializer.Serialize 删除所有属性来序列化以下对象。我知道这是一种不好的做法,但我必须通过模拟 XML(它是手动解析的)与旧的 c++ 编写的服务器进行对话,并且它不处理属性等

我的class是

[DataContract(Namespace = "", Name = "DataValutaRequest")]
public class DateValueRequestPayload
{
    [DataMember()]
  
    public int Cross { get; set; }
    [DataMember()]
 
    public DateTime TradeDate { get; set; }
}

它被序列化为

<?xml version="1.0" encoding="utf-8"?><DataValutaRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Cross>11</Cross><TradeDate>2015-07-27T00:00:00+02:00</TradeDate></DataValutaRequest>

我需要删除

<?xml version="1.0" encoding="utf-8"?>
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"

我该怎么做? 谢谢

更新 1:这不是重复的,因为它与 servicestack 的序列化有关,而不是 MS 序列化...

如果你总是只需要删除这两个文本,你可以使用

serialized = serialized.Remove(0, @"<?xml version=""1.0"" encoding=""utf-8""?>".Length);
serialized = serialized.Remove(test.IndexOf(@"xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"), @"xmlns:i=""http://www.w3.org/2001/XMLSchema-instance".Length);

这是一种非常简单的方法,因为它实际上不会解析 xml,因此如果您需要更通用的方法,您必须解析 xml 并使用该信息删除零件。

xmlns:i XML 命名空间由 .NET 的 DataContractSerializer 自动生成,不提供省略它的选项。

删除它的唯一真正方法是序列化为 XML,然后从原始 XML 中剥离属性,例如:

var xml = dto.ToXml()
    .Replace(" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"","");
return xml;

如果您有更复杂的要求,您还可以查看加载和 removing XML with XDocument