如何在此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; }
答案 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
属性。