16

我正在使用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>

而且我想摆脱这些“d1p1”命名空间前缀,只想要</PointDictionary>like 标记而不是</d1p1:PointsDictionary>. 我已经尝试将 DataMember 属性放在我的类属性上,但它并没有解决很多问题。由于最终用户可以编辑输出 XML 文件,因此与上述文件相比,我想要一个看起来更清晰的 XML 文件。

首要任务是仅通过代码控制它,如果不可能,则使用 XSLT 或任何其他模式。

4

3 回答 3

6

使用空命名空间似乎会删除前缀。使用以下 DataContract 属性设置您的类:

[DataContract(Namespace="")]
public class MyClass
{ ... }

然后确保在(反)序列化时将命名空间设置为空字符串:

DataContractSerializer deserializer = new DataContractSerializer(typeof(MyClass), typeof(MyClass).Name, "");
于 2013-04-24T20:25:59.427 回答
4

看起来DataContractSerializer对前缀没有太多控制。如果要控制命名 空间前缀, XML 序列化和命名空间前缀的答案建议使用。XmlSerializer

您的问题不清楚是否要完全删除域模型的命名空间前缀。上面的示例有几个命名空间前缀:d1p1、d2p1、d4p1。 在 XSL Translation 中更改 XML 文件的名称空间为使用 XSLT 重命名前缀提供了一些指导。

于 2012-08-15T14:29:39.527 回答
0

您应该能够通过确保您尝试序列化为 XML 的类在同一个命名空间中来摆脱这些前缀。例如,我有两个类 ApplicationListResponse 和 Application。以前的命名空间是 Models.Responses 和 Models.Responses.Application。我将两个命名空间都更改为“模型”,并且去掉了 XML 输出中的前缀。

于 2016-11-01T15:09:01.913 回答