删除API中.NET XML序列化中类型对象属性的名称空间

时间:2018-08-31 21:07:53

标签: c# .net xml serialization xml-namespaces

如何在此XML属性上获得这个不必要的名称空间?它可以是十进制或整数。

<Score xmlns:d6p1="http://www.w3.org/2001/XMLSchema" i:type="d6p1:double">2.5</Score>

应该

<Score>2.5</Score>

课程

[DataContract(Name = "Participant", Namespace = "")] 
public class ApiGameParticipant
{
    [DataMember(IsRequired = false, EmitDefaultValue = false)]
    public object Score { get; set; }

2 个答案:

答案 0 :(得分:0)

如果您需要XML看起来完全一样或想要删除名称空间,那么使用XmlSerializer可能会更好。 DataContractSerializer不能像假定您在两端都使用它那样提供相同级别的控制-并且名称空间在这方面至关重要,因为名称空间可以解决类型的一致序列化和反序列化。

答案 1 :(得分:0)

假定名称空间前缀“ i”在某些包含元素中绑定到http://www.w3.org/2001/XMLSchema-instance。在这种情况下,如果删除命名空间d6p1的声明,则文档将不是xsd-schema-valid。这是因为xsi:type属性(通常是这样写的)必须是QName,并且要成为有效的QName,必须声明前缀部分(在这种情况下为d6p1)。

现在,也许您不需要文档是架构有效的。在那种情况下,我也将摆脱i:type属性。保留属性但丢失赋予其含义的名称空间声明似乎是一个糟糕的主意。

如果要摆脱属性和名称空间,使用XSLT就很容易。

LATER

更仔细地看您的问题,我发现您确实想摆脱属性和名称空间声明。用于所有元素的XSLT代码是:

<xsl:template match="*">
  <xsl:element name="{local-name()}" namespace="{namespace-uri()}">
    <xsl:apply-templates select="@*|*"/>
  </xsl:element>
</xsl:template>

<xsl:template match="@*">
  <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="@i:type"
  xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>

第一个规则不变地复制元素,但不保留未使用的名称空间;第二条规则不变地复制属性;第三条规则删除i:type属性。