Serialization 删除“;d1p1";DataContractSerializer XML输出中的命名空间前缀

Serialization 删除“;d1p1";DataContractSerializer XML输出中的命名空间前缀,serialization,namespaces,xml-serialization,prefix,wcf-serialization,Serialization,Namespaces,Xml Serialization,Prefix,Wcf Serialization,我正在使用DatacontractSerializer将我的domainModel序列化为xml文件。 我得到的输出如下 <z:anyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1" xmlns:d1p1="DCSerialization_IGITApproach" i:type="d1p1:X" xmlns:z="http://schemas.microsoft.com/2003/10/Serializat

我正在使用
DatacontractSerializer
将我的domainModel序列化为xml文件。 我得到的输出如下

<z:anyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1" xmlns:d1p1="DCSerialization_IGITApproach" i:type="d1p1:X" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
  <d1p1:Name z:Id="2">Ankit</d1p1:Name>
  <d1p1:PointsDictionary xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" z:Id="3" z:Size="1">
    <d2p1:KeyValueOfstringPointsArrayq9VX7VJJ>
      <d2p1:Key z:Id="4">key1</d2p1:Key>
      <d2p1:Value xmlns:d4p1="http://schemas.datacontract.org/2004/07/SerializationApproach" z:Id="5">
        <d4p1:points z:Id="6" z:Size="2">
          <d2p1:double>45.5</d2p1:double>
          <d2p1:double>546.45</d2p1:double>
        </d4p1:points>
      </d2p1:Value>
    </d2p1:KeyValueOfstringPointsArrayq9VX7VJJ>
  </d1p1:PointsDictionary>
</z:anyType>

安基特
关键1
45.5
546.45
我想去掉这些“d1p1”名称空间前缀,只需要像标签一样的
而不是
。 我尝试将DataMember属性放在我的类属性上,但这并不能解决很多问题。 由于输出XML文件可以由最终用户编辑,因此我希望与上面的XML文件相比,XML文件看起来更干净


第一个优先事项是仅通过代码控制它,如果不可能,则使用XSLT或任何其他模式。

看起来
DataContractSerializer
对前缀没有太多控制。对的回答建议,如果要控制名称空间前缀,请使用
XmlSerializer


您的问题不清楚是否要完全删除域模型的名称空间前缀。上面的示例有几个名称空间前缀:d1p1、d2p1、d4p1。提供有关使用XSLT重命名前缀的一些指导。

使用空名称空间似乎可以删除前缀。使用以下DataContract属性设置类:

[DataContract(Namespace="")]
public class MyClass
{ ... }
然后确保在(反)序列化时将命名空间设置为空字符串:

DataContractSerializer deserializer = new DataContractSerializer(typeof(MyClass), typeof(MyClass).Name, "");

只要确保要序列化为XML的类位于同一名称空间中,就应该能够去掉这些前缀。例如,我有两个类ApplicationListResponse和Application。以前,名称空间是Models.Responses和Models.Responses.Application。我将这两个名称空间都更改为“Models”,从而去掉了XML输出中的前缀

欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
{}
),以精确地格式化和语法突出显示它!与DataContractSerializer相比,XmlSerializer受到两个限制:它不会处理接口,并且它强制每个类都具有无参数构造函数。我相信使用DataContractSerializer并找到其他处理名称空间问题的方法是一个更好的长期解决方案。@Contango,我原则上同意。。。除了
DataContractSerializer
确实(以我的经验)需要一个无参数构造函数。如果我试图在没有类型的情况下实例化它,就会出现运行时错误。@harpo DataContractSerializer绝对不需要空构造函数。你做错事了。如果你想在一个新问题中发布你的代码,我很乐意复习。@Dan,我相信你是对的,我会改正的。对于讨论中的项目,我最终选择了
XmlSerializer
,用(至少是潜在的)不变性来更好地控制序列化。@harpo我仍然很好奇您是如何尝试利用DataContractSerializer的,特别是如果您认为XmlSerializer提供了更好的控制的话。事实上,这正是我开始远离XmlSerializer的原因。通过将DataContractSerializer与XmlWriter结合使用,您可以在不受XmlSerializer限制的情况下获得XML的许多优点。也许,当您有空闲时间时,您可能会对研究这种方法感兴趣。